广州凡科互联网科技有限公司

营业时间
MON-SAT 9:00-18:00

全国服务热线
18720358503

公司门店地址
广州市海珠区工业大道北67号凤凰创意园

Go 选用 goroutine 和 channel 完成工作中池

日期:2021-02-28 浏览:
假定有一组每日任务必须多线程解决且量非常大,那么我们必须同时打开好几个 worker 以确保每日任务的解决速率而不容易阻塞每日任务。别的語言,将会会需 要打开多过程来进行,多过程的操纵、IO 耗费等会是个必须留意的难题,而这种 Go 都能给我们很随便的处理。

大概的完成关键点和步骤:


建立3个 Worker 协程,用以接受和解决来源于 messages 信道的每日任务信息,并将解决結果根据信道 result 回到 根据信道 messages 公布10条每日任务 根据信道 result 接受每日任务解决結果 实例编码:

 package main
import (
 fmt 
 strconv 
 math/rand 
 time 
type Message struct {
 Id int
 Name string
func main() {
 messages := make(chan Message, 100)
 result := make(chan error, 100)
 // 建立每日任务解决Worker
 for i := 0; i 3; i ++ {
 go worker(i, messages, result)
 total := 0
 // 公布每日任务
 for k := 1; k = 10; k ++ {
 messages - Message{Id: k, Name: job + strconv.Itoa(k)}
 total += 1
 close(messages)
 // 接受每日任务解决結果
 for j := 1; j = total; j ++ {
 res := -result
 if res != nil {
 fmt.Println(res.Error())
 close(result)
func worker(worker int, msg -chan Message, result chan - error) {
 // 从安全通道 chan Message 中监视 接受新的每日任务
 for job := range msg {
 fmt.Println( worker: , worker, msg: , job.Id, : , job.Name)
 // 仿真模拟每日任务实行時间
 time.Sleep(time.Second * time.Duration(RandInt(1, 3)))
 // 根据安全通道回到实行結果
 result - nil
func RandInt(min, max int) int {
 rand.Seed(time.Now().UnixNano())
 return min + rand.Intn(max-min+1)


网站知识

联系方式丨CONTACT

  • 全国热线:18720358503
  • 传真热线:18720358503
  • Q Q咨询:2639601583
  • 企业邮箱:2639601583@qq.com

首页
电话
短信
联系