Golang并發(fā)編程如何實(shí)現(xiàn)

小樊
81
2024-08-30 03:52:46
欄目: 編程語言

在Golang中,并發(fā)編程主要通過goroutines和channels來實(shí)現(xiàn)。Goroutines是輕量級(jí)的線程,可以在一個(gè)操作系統(tǒng)線程上并發(fā)執(zhí)行多個(gè)任務(wù)。Channels則用于在不同的goroutines之間傳遞數(shù)據(jù)。

下面是一個(gè)簡單的示例,展示了如何使用goroutines和channels實(shí)現(xiàn)并發(fā)編程:

package main

import (
	"fmt"
	"sync"
)

func worker(id int, wg *sync.WaitGroup, jobs <-chan int, results chan<- int) {
	defer wg.Done()

	for job := range jobs {
		fmt.Printf("Worker %d started job %d\n", id, job)
		results <- job * 2
		fmt.Printf("Worker %d finished job %d\n", id, job)
	}
}

func main() {
	const numJobs = 10
	const numWorkers = 3

	jobs := make(chan int, numJobs)
	results := make(chan int, numJobs)

	var wg sync.WaitGroup
	wg.Add(numWorkers)

	for i := 0; i < numWorkers; i++ {
		go worker(i, &wg, jobs, results)
	}

	for i := 0; i < numJobs; i++ {
		jobs <- i
	}
	close(jobs)

	wg.Wait()
	close(results)

	for result := range results {
		fmt.Println("Result:", result)
	}
}

在這個(gè)示例中,我們創(chuàng)建了一個(gè)名為worker的函數(shù),它接收一個(gè)整數(shù)作為輸入,并將其乘以2作為結(jié)果返回。我們創(chuàng)建了3個(gè)工作線程(goroutines),它們從jobs通道中讀取任務(wù),并將結(jié)果寫入results通道。

main函數(shù)中,我們創(chuàng)建了jobsresults通道,然后啟動(dòng)了3個(gè)工作線程。接著,我們將10個(gè)任務(wù)發(fā)送到jobs通道。最后,我們等待所有工作線程完成任務(wù),并關(guān)閉results通道。在這個(gè)過程中,我們可以看到任務(wù)是如何在不同的工作線程之間并發(fā)執(zhí)行的。

0