ZBLOG

golang 写一个 开 5个协程执行 job,主协程在不断地加 job,子协程在不断地消费 job,并将结果数据记录到主协程的变量中,这个变量要控制好多协程访问安全,最终主协程等 所有子协程退出,写一个 demo

下面是一个使用 Go 编写的示例程序,实现了主协程不断添加任务,子协程消费任务并将结果记录到主协程的变量中,并且确保了多个协程之间的访问安全。

  1. package main
  2. import (
  3. "fmt"
  4. "sync"
  5. )
  6. type Job struct {
  7. ID int
  8. Result int
  9. }
  10. func worker(id int, jobs <-chan Job, results chan<- Job) {
  11. for job := range jobs {
  12. job.Result = job.ID * 2 // 示例中的工作是将 ID 值乘以 2
  13. results <- job
  14. }
  15. }
  16. func main() {
  17. jobs := make(chan Job)
  18. results := make(chan Job)
  19. done := make(chan struct{})
  20. var wg sync.WaitGroup
  21. // 启动五个子协程
  22. for i := 1; i <= 5; i++ {
  23. wg.Add(1)
  24. go func(id int) {
  25. defer wg.Done()
  26. worker(id, jobs, results)
  27. }(i)
  28. }
  29. go func() {
  30. wg.Wait()
  31. close(results) // 所有子协程退出后关闭结果通道
  32. }()
  33. go func() {
  34. for result := range results {
  35. fmt.Printf("Job ID: %d, Result: %d\n", result.ID, result.Result)
  36. }
  37. done <- struct{}{}
  38. }()
  39. for i := 1; i <= 10; i++ { // 主协程添加10个任务
  40. jobs <- Job{ID: i}
  41. }
  42. close(jobs) // 所有任务添加完成后关闭任务通道
  43. <-done // 等待输出结果完成
  44. fmt.Println("All jobs have been completed.")
  45. }

上述代码中,通过创建一个任务通道 jobs 和结果通道 results,主协程不断向任务通道发送任务。子协程从任务通道接收任务并处理,并将结果发送到结果通道。主协程在另外一个 goroutine 中从结果通道接收结果并输出。

通过使用 sync.WaitGroup 来等待所有子协程完成工作,并使用信号量 done 来确保输出结果完成后程序才退出。这样可以保证多个协程之间的安全访问和正确的执行顺序。

请注意,上述示例只是一个简单的演示,实际情况可能需要根据具体需求进行适当调整和扩展。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=14928

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?