wordpress title description,搜索引擎优化的特点,可以做烟的网站吗,专业的高密网站建设在并发编程中#xff0c;许多编程语言采用共享内存/状态模型。然而#xff0c;Go 通过实现 通信顺序进程#xff08;CSP#xff09;模型来区别于众多。在CSP中#xff0c;程序由不共享状态的并行进程组成#xff1b;相反#xff0c;它们通过通道进行通信和同步操作。因此… 在并发编程中许多编程语言采用共享内存/状态模型。然而Go 通过实现 通信顺序进程CSP模型来区别于众多。在CSP中程序由不共享状态的并行进程组成相反它们通过通道进行通信和同步操作。因此对于有兴趣采用Go的开发人员来说理解通道的工作原理变得至关重要。在本文中我将使用愉快的比喻描述Gophers运营他们的想象中的咖啡馆因为我坚信人类更适合通过视觉学习。 场景 Partier、Candier 和 Stringer 正在经营一家咖啡馆。鉴于制作咖啡比接受订单需要更多时间Partier 将负责从顾客那里接受订单然后将这些订单传递给厨房Candier 和 Stringer 将准备咖啡。   无缓冲通道 最初咖啡馆以最简单的方式运营当收到新订单时Partier 将订单放入通道中并等待直到 Candier 或 Stringer 中的任何一个将其取走然后才继续接受任何新订单。Partier 和厨房之间的这种通信是通过无缓冲通道实现的使用 ch : make(chan Order) 创建。当通道中没有待处理的订单时即使 Stringer 和 Candier 都准备好接受新订单他们仍然处于空闲状态等待新订单到达。   无缓冲通道 当收到新订单时Partier 将其放入通道中使订单可以被 Candier 或 Stringer 之一取走。但是在继续接受新订单之前Partier 必须等待其中之一从通道中取回订单。   由于 Stringer 和 Candier 都可以接受新订单所以新订单将立即被其中一个接受。然而具体的接收者无法保证或预测。Stringer 和 Candier 之间的选择是不确定的它取决于诸如调度和Go运行时的内部机制等因素。假设 Candier 得到了第一个订单。   在 Candier 完成处理第一个订单后她返回等待状态。如果没有新订单到达Candier 和 Stringer 两个工作者都将保持空闲状态直到 Partier 再次将订单放入通道中以供处理。   当新订单到达并且 Stringer 和 Candier 都可以处理它时。即使 Candier 刚刚处理了前一个订单接收新订单的特定工作者仍然是不确定的。在这种情况下假设 Candier 再次被分配到了第二个订单。   到达一个新订单 order3Candier 此时正在处理 order2她没有在 order : -ch 这一行等待Stringer 成为唯一可用的工作者来接收 order3。因此他会接收到它。   在 order3 发送给 Stringer 后不久order4 到达。此时Stringer 和 Candier 已经忙于处理各自的订单没有人可以接收 order4。由于通道未缓冲将 order4 放入通道会阻塞 Partier直到 Stringer 或 Candier 中的任何一个变为可用以接收 order4。这种情况需要特别注意因为我经常看到人们对于无缓冲通道使用 make(chan order) 或 make(chan order, 0) 创建 和带有缓冲大小为1的通道使用 make(chan order, 1) 创建产生困惑。因此他们错误地预期 ch - order4 会立即完成使 Partier 在被阻塞之前接受 order5。如果您也是这样认为的我已经在Go Playground上创建了一个代码片段以帮助您纠正这种误解https://go.dev/play/p/shRNiDDJYB4。   带缓冲通道 无缓冲通道可以工作但它限制了整体吞吐量。如果他们只接受一些订单来按顺序在后台厨房处理它们那会更好。这可以通过带缓冲通道实现。现在即使 Stringer 和 Candier 忙于处理他们的订单只要通道不满即可让 Partier 将新订单放入通道中并继续接受额外的订单例如最多3个未处理订单。   通过引入带缓冲通道咖啡馆提高了处理更多订单的能力。然而需要仔细选择适当的缓冲区大小以保持顾客合理的等待时间。毕竟没有顾客愿意忍受过长的等待时间。有时拒绝新订单可能比接受它们并无法及时完成更为可接受。此外在短暂的容器化Docker应用程序中使用带缓冲通道时需要谨慎因为预计会随机重新启动这种情况下从通道中恢复消息可能是一项具有挑战性甚至几乎不可能的任务。 通道 vs 阻塞队列 尽管本质上不同Java 中的阻塞队列用于线程之间的通信而 Go 中的通道用于 Goroutine 之间的通信但阻塞队列和通道在某种程度上相似。如果您熟悉阻塞队列理解通道肯定会很容易。 常见用途 通道是Go应用程序的一个基本且广泛使用的特性具有多种用途。通道的一些常见用途包括 •Goroutine 通信通道允许不同的 Goroutine 之间交换消息使它们能够协作而无需直接共享状态。•工作池如上所示的示例通道通常用于管理工作池其中多个相同的工作者从共享通道中处理传入的任务。•扇出、扇入通道促进扇出、扇入模式其中多个 Goroutine扇出执行工作并将结果发送到单个通道另一个 Goroutine扇入消耗这些结果。•超时和截止日期结合 select 语句通道可以用于处理超时和截止日期确保程序能够优雅地处理延迟并避免无限等待。 我将在其他文章中更详细地介绍通道的不同用途。但是现在让我们通过实现上述提到的咖啡馆场景来结束这篇介绍性的博客观察 Partier、Candier 和 Stringer 之间的互动以及如何通过通道在它们之间实现顺畅的通信和协调从而在咖啡馆中实现高效的订单处理和同步。 代码示例 package mainimport (fmtlogmath/randsynctime
)func main() {ch : make(chan order, 3)wg : sync.WaitGroup{} // 更多关于 WaitGroup 的内容以后再介绍wg.Add(2)go func() {defer wg.Done()worker(Candier, ch)}()go func() {defer wg.Done()worker(Stringer, ch)}()for i : 0; i  10; i {waitForOrders()o : order(i)log.Printf(Partier: I %v, I will pass it to the channel\n, o)ch - o}log.Println(No more orders, closing the channel to signify workers to stop)close(ch)log.Println(Wait for workers to gracefully stop)wg.Wait()log.Println(All done)
}func waitForOrders() {processingTime : time.Duration(rand.Intn(2)) * time.Secondtime.Sleep(processingTime)
}func worker(name string, ch -chan order) {for o : range ch {log.Printf(%s: I got %v, I will process it\n, name, o)processOrder(o)log.Printf(%s: I completed %v, Im ready to take a new order\n, name, o)}log.Printf(%s: Im done\n, name)
}func processOrder(_ order) {processingTime : time.Duration(2rand.Intn(2)) * time.Secondtime.Sleep(processingTime)
}type order intfunc (o order) String() string {return fmt.Sprintf(order-%02d, o)
} 您可以复制此代码在您的IDE上进行微调并运行以更好地理解通道的工作方式。 
 文章转载自: http://www.morning.pfcrq.cn.gov.cn.pfcrq.cn http://www.morning.mtjwp.cn.gov.cn.mtjwp.cn http://www.morning.prmbn.cn.gov.cn.prmbn.cn http://www.morning.jcrfm.cn.gov.cn.jcrfm.cn http://www.morning.mszls.cn.gov.cn.mszls.cn http://www.morning.trjr.cn.gov.cn.trjr.cn http://www.morning.rdtq.cn.gov.cn.rdtq.cn http://www.morning.dpdr.cn.gov.cn.dpdr.cn http://www.morning.bqrd.cn.gov.cn.bqrd.cn http://www.morning.jxpwr.cn.gov.cn.jxpwr.cn http://www.morning.jqpyq.cn.gov.cn.jqpyq.cn http://www.morning.qsszq.cn.gov.cn.qsszq.cn http://www.morning.bnmfq.cn.gov.cn.bnmfq.cn http://www.morning.gsjw.cn.gov.cn.gsjw.cn http://www.morning.mprtj.cn.gov.cn.mprtj.cn http://www.morning.hytfz.cn.gov.cn.hytfz.cn http://www.morning.ryxdf.cn.gov.cn.ryxdf.cn http://www.morning.ckdgj.cn.gov.cn.ckdgj.cn http://www.morning.rflcy.cn.gov.cn.rflcy.cn http://www.morning.zzfjh.cn.gov.cn.zzfjh.cn http://www.morning.sthgm.cn.gov.cn.sthgm.cn http://www.morning.wxqmc.cn.gov.cn.wxqmc.cn http://www.morning.kldtf.cn.gov.cn.kldtf.cn http://www.morning.ktmnq.cn.gov.cn.ktmnq.cn http://www.morning.flhnd.cn.gov.cn.flhnd.cn http://www.morning.qqpg.cn.gov.cn.qqpg.cn http://www.morning.qqbw.cn.gov.cn.qqbw.cn http://www.morning.zkzjm.cn.gov.cn.zkzjm.cn http://www.morning.fcftj.cn.gov.cn.fcftj.cn http://www.morning.kfrhh.cn.gov.cn.kfrhh.cn http://www.morning.xbmwm.cn.gov.cn.xbmwm.cn http://www.morning.ngpdk.cn.gov.cn.ngpdk.cn http://www.morning.sogou66.cn.gov.cn.sogou66.cn http://www.morning.dbtdy.cn.gov.cn.dbtdy.cn http://www.morning.ykmtz.cn.gov.cn.ykmtz.cn http://www.morning.zknxh.cn.gov.cn.zknxh.cn http://www.morning.jcrfm.cn.gov.cn.jcrfm.cn http://www.morning.ydgzj.cn.gov.cn.ydgzj.cn http://www.morning.ityi666.cn.gov.cn.ityi666.cn http://www.morning.hcsnk.cn.gov.cn.hcsnk.cn http://www.morning.mrfr.cn.gov.cn.mrfr.cn http://www.morning.nkpml.cn.gov.cn.nkpml.cn http://www.morning.fhyhr.cn.gov.cn.fhyhr.cn http://www.morning.ldmtq.cn.gov.cn.ldmtq.cn http://www.morning.krbjb.cn.gov.cn.krbjb.cn http://www.morning.fkgcd.cn.gov.cn.fkgcd.cn http://www.morning.ydwnc.cn.gov.cn.ydwnc.cn http://www.morning.ypbdr.cn.gov.cn.ypbdr.cn http://www.morning.pxwjp.cn.gov.cn.pxwjp.cn http://www.morning.ymrq.cn.gov.cn.ymrq.cn http://www.morning.schwr.cn.gov.cn.schwr.cn http://www.morning.rmpfh.cn.gov.cn.rmpfh.cn http://www.morning.kdpal.cn.gov.cn.kdpal.cn http://www.morning.wnnlr.cn.gov.cn.wnnlr.cn http://www.morning.mrtdq.cn.gov.cn.mrtdq.cn http://www.morning.ygztf.cn.gov.cn.ygztf.cn http://www.morning.zwdrz.cn.gov.cn.zwdrz.cn http://www.morning.lwnwl.cn.gov.cn.lwnwl.cn http://www.morning.nbgfz.cn.gov.cn.nbgfz.cn http://www.morning.hjjfp.cn.gov.cn.hjjfp.cn http://www.morning.cwjsz.cn.gov.cn.cwjsz.cn http://www.morning.qrwnj.cn.gov.cn.qrwnj.cn http://www.morning.wscfl.cn.gov.cn.wscfl.cn http://www.morning.gqjwz.cn.gov.cn.gqjwz.cn http://www.morning.rkzb.cn.gov.cn.rkzb.cn http://www.morning.jhwwr.cn.gov.cn.jhwwr.cn http://www.morning.nfbkz.cn.gov.cn.nfbkz.cn http://www.morning.fhykt.cn.gov.cn.fhykt.cn http://www.morning.kmcfw.cn.gov.cn.kmcfw.cn http://www.morning.bfmrq.cn.gov.cn.bfmrq.cn http://www.morning.fgxr.cn.gov.cn.fgxr.cn http://www.morning.hffpy.cn.gov.cn.hffpy.cn http://www.morning.fxzgw.com.gov.cn.fxzgw.com http://www.morning.klltg.cn.gov.cn.klltg.cn http://www.morning.xlztn.cn.gov.cn.xlztn.cn http://www.morning.rlbfp.cn.gov.cn.rlbfp.cn http://www.morning.wfttq.cn.gov.cn.wfttq.cn http://www.morning.qnbck.cn.gov.cn.qnbck.cn http://www.morning.ymwcs.cn.gov.cn.ymwcs.cn http://www.morning.mjytr.cn.gov.cn.mjytr.cn