Fahami perbezaan penting antara concurrency dan paralelisme dalam bahasa Go

王林
Lepaskan: 2024-03-12 16:12:04
asal
734 orang telah melayarinya

Fahami perbezaan penting antara concurrency dan paralelisme dalam bahasa Go

Apabila mempelajari pengaturcaraan serentak, anda sering mendengar dua konsep: Concurrency dan Parallelism. Walaupun kedua-dua istilah ini kadangkala digunakan secara bergantian, ia sebenarnya mewakili dua konsep yang berbeza. Dalam bahasa Go, memahami perbezaan penting antara concurrency dan parallelism adalah penting untuk menulis program serentak yang cekap dan boleh dipercayai.

Pertama, mari kita fahami konsep konkurensi. Concurrency merujuk kepada cara pengaturcaraan yang membolehkan berbilang tugasan dilaksanakan pada masa yang sama, tetapi tidak semestinya pada masa yang sama. Dalam model concurrency, tugasan boleh dilaksanakan secara bergilir-gilir, dan kesan pelaksanaan "serentak" dicapai dengan menukar konteks. Dalam bahasa Go, anda boleh menggunakan goroutine untuk mencapai concurrency Setiap goroutine mewakili tugasan yang dilaksanakan serentak.

Berikut ialah contoh mudah yang menunjukkan cara menggunakan goroutine untuk mencapai konkurensi:

package main

import (
    "fmt"
    "time"
)

func printNumbers() {
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
        time.Sleep(1 * time.Second)
    }
}

func main() {
    go printNumbers()
    go printNumbers()
    time.Sleep(6 * time.Second)
}
Salin selepas log masuk

Dalam contoh di atas, kami mentakrifkan fungsi printNumbers untuk mencetak nombor dari 1 hingga 5. Dalam fungsi main, dua gorout printNumbers dimulakan melalui kata kunci go supaya ia boleh dilaksanakan secara serentak. Gunakan fungsi time.Sleep untuk menunggu masa yang mencukupi bagi memastikan goroutine mempunyai masa yang mencukupi untuk dilaksanakan. printNumbers函数,用于打印1到5的数字。在main函数中,通过go关键字启动了两个printNumbers的goroutine,这样它们就可以并发地执行。通过time.Sleep函数来等待足够的时间,确保goroutine有足够的时间来执行。

接着,我们来看一下并行(Parallelism)的概念。并行是指多个任务真正同时执行,且可以利用多核处理器的特性来提高性能。在Go语言中,可以使用runtime包中的GOMAXPROCS来设置并行度,指定可以同时执行的goroutine数量。

下面是一个使用并行的例子:

package main

import (
    "fmt"
    "runtime"
    "sync"
)

func printNumbers(wg *sync.WaitGroup) {
    defer wg.Done()
    for i := 1; i <= 5; i++ {
        fmt.Println(i)
    }
}

func main() {
    runtime.GOMAXPROCS(2) // 设置并行度为2
    var wg sync.WaitGroup
    wg.Add(2)

    go printNumbers(&wg)
    go printNumbers(&wg)

    wg.Wait()
}
Salin selepas log masuk

在上面的例子中,我们使用sync.WaitGroup来等待所有的goroutine执行完毕。通过runtime.GOMAXPROCS

Seterusnya, mari kita lihat konsep Paralelisme. Paralelisme bermakna berbilang tugasan benar-benar dilaksanakan serentak, dan ciri pemproses berbilang teras boleh digunakan untuk meningkatkan prestasi. Dalam bahasa Go, anda boleh menggunakan GOMAXPROCS dalam pakej runtime untuk menetapkan tahap selari dan menentukan bilangan goroutine yang boleh dilaksanakan secara serentak.

Berikut ialah contoh penggunaan selari: 🎜rrreee🎜Dalam contoh di atas, kami menggunakan sync.WaitGroup untuk menunggu semua goroutine menyelesaikan pelaksanaan. Tetapkan selari kepada 2 melalui runtime.GOMAXPROCS supaya dua goroutine boleh dilaksanakan pada masa yang sama. Dalam aplikasi praktikal, kelebihan prestasi yang dibawa oleh pemproses berbilang teras boleh digunakan sepenuhnya dengan menetapkan keselarian secara munasabah mengikut bilangan teras mesin dan ciri-ciri tugas. 🎜🎜Melalui contoh di atas, kita dapat melihat aplikasi konkurensi dan selari dalam bahasa Go. Concurrency ialah paradigma pengaturcaraan yang membolehkan pelbagai tugasan dilaksanakan secara bergilir-gilir menggunakan pemproses berbilang teras untuk melaksanakan berbilang tugas pada masa yang sama untuk meningkatkan prestasi program. Untuk menulis program serentak yang cekap dan boleh dipercayai, adalah penting untuk memahami perbezaan penting antara konkurensi dan selari. Saya harap contoh di atas dapat membantu anda memahami dengan lebih baik konsep konkurensi dan selari dalam bahasa Go. 🎜

Atas ialah kandungan terperinci Fahami perbezaan penting antara concurrency dan paralelisme dalam bahasa Go. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan
Tentang kita Penafian Sitemap
Laman web PHP Cina:Latihan PHP dalam talian kebajikan awam,Bantu pelajar PHP berkembang dengan cepat!