Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ketahui model pengaturcaraan serentak dalam bahasa Go dan laksanakan pengagihan tugas untuk pengkomputeran teragih?

Ketahui model pengaturcaraan serentak dalam bahasa Go dan laksanakan pengagihan tugas untuk pengkomputeran teragih?

王林
王林asal
2023-07-30 08:54:301371semak imbas

Ketahui model pengaturcaraan serentak dalam bahasa Go dan laksanakan peruntukan tugas untuk pengkomputeran teragih

Dalam sistem komputer moden, penggunaan pemproses berbilang teras secara cekap untuk melaksanakan tugas secara serentak merupakan cabaran teknikal yang penting. Sebagai bahasa pengaturcaraan yang menyokong konkurensi tinggi, bahasa Go dilengkapi dengan alatan dan mekanisme tersendiri untuk pengaturcaraan serentak, dan digunakan secara meluas dalam bidang pengkomputeran teragih. Artikel ini akan memperkenalkan model pengaturcaraan serentak dalam bahasa Go dan menggunakan contoh untuk menunjukkan cara menggunakan bahasa Go untuk melaksanakan pengagihan tugas teragih.

Model pengaturcaraan serentak

Bahasa Go menyediakan satu set mekanisme pengaturcaraan serentak melalui goroutine dan saluran. Goroutine ialah utas ringan yang diuruskan oleh penjadual bahasa Go. Berbanding dengan benang tradisional, penciptaan goroutine dan overhed pemusnahan adalah lebih kecil, dan beribu-ribu goroutine boleh dibuat secara serentak. Kita boleh menggunakan kata kunci go untuk menukar panggilan fungsi kepada pelaksanaan serentak goroutine, contohnya:

go func() {
    // goroutine的函数体
}()

saluran ialah saluran paip untuk komunikasi antara goroutine dan boleh digunakan untuk memindahkan data dan menyegerakkan pelaksanaan goroutine. Saluran menyediakan operasi hantar dan terima Apabila goroutine menghantar data ke saluran, ia akan disekat sehingga goroutine lain menerima data daripada saluran. Kita boleh menggunakan fungsi make untuk mencipta saluran dan menggunakan operator <- untuk operasi penghantaran dan penerimaan, contohnya:

ch := make(chan int)
ch <- 42 // 发送数据到channel
x := <-ch // 从channel接收数据

Melalui goroutine dan saluran, kita boleh melaksanakan peruntukan tugas serentak dan pengumpulan hasil dengan mudah. Seterusnya, kami akan menggunakan mekanisme ini untuk melaksanakan contoh pengkomputeran teragih mudah.

Peruntukan tugas teragih

Andaikan kita mempunyai tugas pengkomputeran yang memerlukan menjumlahkan tatasusunan integer yang besar, dan kita ingin mengagihkan tugas ini kepada berbilang komputer untuk pengkomputeran selari. Untuk melaksanakan fungsi peruntukan tugas dan pengumpulan hasil, kita boleh menggunakan gabungan goroutine dan saluran.

Pertama, kita perlu membahagikan tatasusunan integer kepada berbilang subtatasusunan dan menetapkan subtatasusunan kepada gorouti yang berbeza untuk pengiraan. Kami boleh mentakrifkan fungsi peruntukan tugas distributeTask, yang bertanggungjawab untuk memperuntukkan tugas kepada goroutine untuk diproses: distributeTask,它负责将任务分配给goroutine处理:

func distributeTask(tasks []int, numWorkers int) chan int {
    ch := make(chan int)

    // 计算每个goroutine需要处理的子数组的长度
    chunkSize := len(tasks) / numWorkers

    // 启动多个goroutine进行计算
    for i := 0; i < numWorkers; i++ {
        start := i * chunkSize
        end := start + chunkSize

        // 将子数组分配给goroutine进行计算
        go func(slice []int) {
            sum := 0
            for _, num := range slice {
                sum += num
            }
            ch <- sum // 将计算结果发送到channel
        }(tasks[start:end])
    }

    return ch
}

在上述代码中,我们首先创建了一个channelch,用于接收每个goroutine的计算结果。然后,我们根据numWorkers的数量将整数数组分割成多个子数组,并通过goroutine进行并行计算。每个goroutine将计算结果发送到channel中。

接下来,我们需要编写一个函数collectResults,它负责从channel中接收每个goroutine的计算结果,并将它们汇总起来:

func collectResults(ch chan int, numWorkers int) int {
    sum := 0

    // 汇总所有goroutine的计算结果
    for i := 0; i < numWorkers; i++ {
        result := <-ch // 从channel接收计算结果
        sum += result
    }

    return sum
}

在上述代码中,我们使用一个循环从channel中接收每个goroutine的计算结果,并将它们累加到sum

func main() {
    // 要计算的整数数组
    tasks := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}

    // 启动4个goroutine进行计算
    numWorkers := 4

    // 分配任务给goroutine进行计算
    ch := distributeTask(tasks, numWorkers)

    // 收集所有goroutine的计算结果
    sum := collectResults(ch, numWorkers)

    fmt.Println("计算结果:", sum)
}

Dalam kod di atas, kami mula-mula mencipta saluran ch untuk Receive hasil pengiraan setiap goroutine. Kemudian, kami membahagi tatasusunan integer kepada berbilang sub-tatasusunan mengikut bilangan numWorkers dan melakukan pengiraan selari melalui goroutine. Setiap goroutine menghantar hasil pengiraan ke saluran.

Seterusnya, kita perlu menulis fungsi collectResults, yang bertanggungjawab untuk menerima hasil pengiraan setiap goroutine daripada saluran dan meringkaskannya:

rrreee

Dalam kod di atas, kami menggunakan gelung Terima hasil pengiraan setiap goroutine daripada saluran dan kumpulkannya ke dalam pembolehubah sum.

Akhir sekali, kita boleh menulis fungsi utama untuk memulakan keseluruhan peruntukan tugasan dan proses pengumpulan hasil, dan mencetak hasil pengiraan akhir:

rrreee

Dengan menjalankan kod di atas, kita boleh mendapatkan hasil penjumlahan tatasusunan integer.

Ringkasan🎜🎜Dengan mempelajari model pengaturcaraan serentak dalam bahasa Go, dan menggunakan contoh untuk menunjukkan cara menggunakan goroutine dan saluran untuk melaksanakan pengkomputeran serentak berdasarkan peruntukan tugas yang diedarkan. Dengan menggunakan goroutine dan saluran dengan betul, kami boleh menggunakan sepenuhnya pemproses berbilang teras dan mencapai pengaturcaraan serentak yang cekap. Dalam aplikasi praktikal, kami boleh mengembangkan dan mengoptimumkan model pengkomputeran teragih ini mengikut keperluan khusus untuk meningkatkan kecekapan dan daya pemprosesan pengkomputeran. 🎜🎜Untuk kod contoh, lihat: https://gist.github.com/example🎜

Atas ialah kandungan terperinci Ketahui model pengaturcaraan serentak dalam bahasa Go dan laksanakan pengagihan tugas untuk pengkomputeran teragih?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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