Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menyegerakkan Goroutines melalui Saluran di Golang

Bagaimana untuk menyegerakkan Goroutines melalui Saluran di Golang

PHPz
PHPzasal
2023-08-15 08:17:061012semak imbas

Golang 中 Goroutines 之间如何通过 Channels 进行同步

Cara menyegerakkan Goroutines melalui Saluran di Golang

Goroutine ialah benang ringan di Golang yang boleh melaksanakan berbilang tugas secara selari dalam satu program. Dalam Goroutine, kita boleh menggunakan Saluran untuk komunikasi dan penyegerakan data. Saluran menyediakan mekanisme komunikasi antara Goroutines untuk memastikan ketepatan dan penyegerakan data.

Di Golang, Saluran ialah elemen selamat jenis yang digunakan untuk menghantar data antara Goroutines. Dengan menggunakan Saluran, kami boleh mencapai penyegerakan antara Goroutines untuk memastikan data dihantar dan diproses pada masa dan susunan yang betul.

Seterusnya, mari lihat contoh kod untuk menunjukkan cara Goroutine menyegerak melalui Saluran:

package main

import (
    "fmt"
    "time"
)

func worker(id int, jobs <-chan int, results chan<- int) {
    for j := range jobs {
        fmt.Println("Worker", id, "started job", j)
        time.Sleep(time.Second)
        fmt.Println("Worker", id, "finished job", j)
        results <- j * 2
    }
}

func main() {
    jobs := make(chan int, 100)
    results := make(chan int, 100)

    // 启动三个 Goroutine 执行任务
    for w := 1; w <= 3; w++ {
        go worker(w, jobs, results)
    }

    // 发送任务到 Jobs Channel
    for j := 1; j <= 5; j++ {
        jobs <- j
    }
    close(jobs)

    // 从 Results Channel 中接收结果
    for a := 1; a <= 5; a++ {
        <-results
    }

    time.Sleep(time.Second)
}

Dalam contoh di atas, kami mencipta dua Saluran: jobs dan results. <code>jobs digunakan untuk menghantar tugas kepada Goroutine dan results digunakan untuk menerima hasil pelaksanaan tugas. jobsresultsjobs 用于发送任务到 Goroutine 中,而 results 用于接收任务执行的结果。

首先,我们通过使用 go 关键字来启动三个 Goroutine 并分别传递了它们所需的 jobsresults Channels。然后,我们循环发送了 5 个任务到 jobs Channel 中,并在完成后关闭了 jobs Channel。

worker 函数中,我们使用 range 关键字来不断地从 jobs Channel 中接收任务,并在处理完任务后将结果发送到 results Channel 中。由于 Channel 是阻塞的,当我们从 jobs Channel 接收到任务时,该 Goroutine 将停止并等待下一个任务的到来。

在主函数中,我们使用了 range 关键字来不断地从 results Channel 中接收结果,在任务执行完毕后,我们通过 <-results 表达式来表示我们要接收结果数据,但实际上我们不会使用这些值。

最后,在主函数中,我们使用了一个延迟函数 time.Sleep(time.Second)

Mula-mula, kami memulakan tiga Goroutine dengan menggunakan kata kunci go dan masing-masing lulus jobs dan results Channels. Kemudian, kami menghantar 5 tugasan ke Saluran jobs dalam satu gelung dan menutup Saluran jobs apabila selesai.

Dalam fungsi worker, kami menggunakan kata kunci range untuk terus menerima tugasan daripada Saluran jobs dan selepas memproses tugasan, Hasilnya dihantar ke Saluran hasil. Memandangkan Saluran menyekat, apabila kami menerima tugas daripada Saluran jobs, Goroutine akan berhenti dan menunggu tugasan seterusnya tiba.

Dalam fungsi utama, kami menggunakan kata kunci range untuk terus menerima hasil daripada Saluran results Selepas tugasan selesai, kami lulus < ungkapan untuk menunjukkan bahawa kami ingin menerima data hasil, tetapi kami sebenarnya tidak akan menggunakan nilai ini. 🎜🎜Akhir sekali, dalam fungsi utama, kami menggunakan fungsi tunda time.Sleep(time.Second) untuk memastikan program tidak ditamatkan serta-merta selepas Goroutine dilaksanakan. 🎜🎜Melalui kod contoh di atas, kita dapat melihat bahawa dengan menggunakan Saluran, kita boleh mencapai penyegerakan antara Goroutines untuk memastikan ketepatan dan susunan data. Dalam aplikasi sebenar, kami boleh mencipta pelbagai jenis Saluran mengikut keperluan untuk memenuhi pelbagai keperluan. 🎜🎜Ringkasnya, penyegerakan antara Goroutines di Golang melalui Saluran ialah mekanisme yang mudah dan berkuasa. Ia bukan sahaja menyediakan komunikasi antara benang, tetapi juga memastikan ketepatan dan penyegerakan data, memberikan kemudahan dan fleksibiliti untuk pengaturcaraan serentak. 🎜

Atas ialah kandungan terperinci Bagaimana untuk menyegerakkan Goroutines melalui Saluran di Golang. 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