入门goroutine并发设计模式以及goroutine可视化工具flybywind

funcf(left,rightchanint){//这个函数就把right的输出和left的输入联系起来了。left<-1+<-right}funcmain(){constn=10000leftmost:=make(chanint)right:=leftmostleft:=leftmost//创建长度为n的daisy链fori:=0;i

那么这个模式有什么用呢?它可以用来处理迭代算法,使得部分迭代运算并发执行。只要迭代的每个阶段都是相互独立的即可。比如,计算质数:

好了,下面我们换些基础的模式讲一下:

代码如下:用一个int表示ball(球),管道表示table(桌子),两个goroutine就是2个运动员,分别编号为1和2。

funcmain(){varBallinttable:=make(chanint)goplayer("2",table)goplayer("1",table)//首先把球放到“桌上”table<-Balltime.Sleep(1*time.Second)//1s后比赛结束……<-table}funcplayer(idstring,tablechanint){for{ball:=<-tablelog.Printf("%sgotball[%d]\n",id,ball)time.Sleep(50*time.Millisecond)log.Printf("%sbouncebackball[%d]\n",id,ball)ball++table<-ball}}输出如下:

1gotball[0]1bouncebackball[0]2gotball[1]2bouncebackball[1]1gotball[2]1bouncebackball[2]2gotball[3]2bouncebackball[3]1gotball[4]1bouncebackball[4]2gotball[5]2bouncebackball[5]代码简洁易懂,很好理解(看不懂的同学请不要拍我)。下面,我们增加一位选手,让3个运动员一块打球

goplayer("2",table)goplayer("3",table)goplayer("1",table)这下子热闹了,输出如下:

1gotball[0]1bouncebackball[0]2gotball[1]2bouncebackball[1]3gotball[2]3bouncebackball[2]1gotball[3]1bouncebackball[3]2gotball[4]2bouncebackball[4]3gotball[5]3bouncebackball[5]1gotball[6]1bouncebackball[6]2gotball[7]2bouncebackball[7]3gotball[8]3bouncebackball[8]看3个人有条不紊的相互击球。此时处女座一定非常满意,但是对于习惯了并发随机性的程序员来说,这实在有些过于美好:为什么它们的顺序如此协调,为什么1总是给2,2给3,3给1,而不是其他顺序呢?

划重点了啊:

也叫“扇入”,应该是并发编程里面比较普通的一个模式了。fan-in会从多个管道读取输入,并汇总到一个channel输出,形象的比喻如下图:示例代码如下

import("fmt""math/rand""os""runtime/trace""time")funcmain(){trace.Start(os.Stderr)c:=fanIn(boring(1),boring(2))fori:=0;i<10;i++{fmt.Println(<-c)}fmt.Println("You'rebothboring;I'mleaving.")trace.Stop()}funcfanIn(input1,input2<-chanint)<-chanint{c:=make(chanint)gofunc(){for{c<-<-input1}}()gofunc(){for{c<-<-input2}}()returnc}funcboring(msgint)<-chanint{c:=make(chanint)gofunc(){//Welaunchthegoroutinefrominsidethefunction.fori:=0;;i++{c<-msg*1000+itime.Sleep(time.Duration(rand.Intn(1e3))*time.Millisecond)}}()returnc//Returnthechanneltothecaller.}输出为:200020011001200210022003100320041004gotrace输出为(注意这是两次独立的运行结果):可以看到,两次的结果都汇入了main线程,并且顺序输出,没有丢失数据,也没有死锁。

当然,简单的情况,用select也可以。

select设计的目的就是在channel中间通讯,谁的数据先到达,哪个case分支先执行。

c1:=boring(1)c2:=boring(2)fori:=0;i<10;i++{select{casev:=<-c1:fmt.Println(v)casev:=<-c2:fmt.Println(v)}}Workers也叫FanOut(扇出),和扇入模式相反,工作模式是一个管道分发任务,多个goroutines来执行。示例代码如下:

gotrace结果如下:圆柱体中心就是main进程中生成的pool进程,围绕它的是36个worker进程。蓝色箭头表示pool每隔10ms分发的任务,它们都被worker处理了。

server模式和fan_out类似,只不过它的worker线程是按需生成的,并且工作处理完毕后就释放。所以这种模式常应用到网站服务器上。在主进程中,有一个for循环,Accept函数一直阻塞着循环的进行,一旦有新的请求过来,Accept就会生成一个connection,然后主进程就创建一个子进程处理这个connection以及其他逻辑。

示例代码如下:

import("fmt""net""os""runtime/trace""time")funchandler(cnet.Conn,chchanint){ch<-len(c.RemoteAddr().String())time.Sleep(10*time.Microsecond)c.Write([]byte("ok"))c.Close()}funclogger(chchanint){for{time.Sleep(1500*time.Millisecond)fmt.Println(<-ch)}}funcserver(lnet.Listener,chchanint){for{c,err:=l.Accept()iferr!=nil{continue}gohandler(c,ch)}}funcmain(){trace.Start(os.Stderr)l,err:=net.Listen("tcp",":5000")iferr!=nil{panic(err)}ch:=make(chanint)gologger(ch)goserver(l,ch)time.Sleep(10*time.Second)trace.Stop()}可以看到,主进程生成了一个tcp连接,启动了server和logger两个子进程。server用来监听外网的请求,一旦请求过来,就会生成一个handler进程,用来处理connection。同时,handler还会通过管道和logger通讯,logger负责异步记录相应日志。

这个程序运行时的输入需要模拟外部请求来产生,为此我写了一个脚本:

#!/bin/shi=0while[[$i-lt20]];do#通过nc发起tcp请求。每秒请求一次echo"hello"$i|nclocalhost5000sleep1((++i))done运行时,先启动这个脚本,然后启动server或gotrace。

gotrace的运行结果如下:

为了解决这个问题,我们正好借助上面介绍的Worker模式,提高logger的并发性。

import("fmt""net""os""runtime/trace""time")funchandler(cnet.Conn,chchanint){ch<-0time.Sleep(50*time.Microsecond)c.Write([]byte("ok"))c.Close()}funclogger(wchchanint){for{fmt.Println(<-wch)//这里主要耗时time.Sleep(1500*time.Millisecond)}}funcpool(chchanint,nint){wch:=make(chanint)fori:=0;i

3D图如下:可以看到,此时server正好处理了10个请求。不再被logger拖延了。

注意我的题目是并发(concurrent)设计模式。那么并发和并行到底啥区别??

Parallelism(并行性):Aconditionthatariseswhenatleasttwothreadsareexecutingsimultaneously.这个就是狭义的并行,即线程、任务必须是同时进行的,否则不算parallelism。

THE END
1.Fanin和Fanout工艺简单介绍Altium Designer9 BGA Fanout 扇出的操作技巧 Altium Designer9 BGA Fanout 扇出的操作技巧。一直使用Altium Designer9,一直没有真正用它来设计基于BGA封装元器件的PCB板。。今天学... 精美工艺刀 精美工艺刀。 CTS介绍——CTS(1) CTS介绍——CTS(1)这是集成电路物理设计的第八个系列【CTS】的第三篇文章,本篇...http://www.360doc.com/content/22/0310/15/78793545_1020918870.shtml
2.Fanin和Fanout工艺简单介绍Fanin 和 Fanout 工艺简单介绍2022-03-10 Jonny_Ji + 关注献花(0) 来自:Jonny_Ji > 《半导体》 猜你喜欢 类似文章【AD】AD bga扇出指南 标准单元工艺库(TSMC 90nm)文件详解 Altium Designer9 BGA Fanout 扇出的操作技巧 精美工艺刀 CTS介绍——CTS(1) PADS中BGA Fanout扇出教程...https://www.360doc.cn/article/78793545_1020918870.html
3.fanin是什么意思fanin在线翻译读音用法例句含义1 . For example, the Capacity of JetFanintunnel flux distribution and resistance loss in the chimney. 重点研究了射流风机在隧道内的的调压性能, 竖井三通的气流分布以及局部阻力损失. 来自互联网 网络释义 -fanin 1 . 扇入端数 fanin扇入端数 faninloading 扇入装入 fanout 扇出端 fanoutloading 扇出装入...https://www.chazidian.com/dict/w/fanin/
4.fanout是什麼意思fanout在線翻譯英語讀音用法例句fanout 英[f?na?t]美[f?na?t] n.輸出端數;展開;扇出 Created with Highcharts 3.0.2释义常用度分布图海词统计 扇出 展开 输出端数 fanout的用法和樣例: 辭彙搭配 fan out成扇形展開 分享单词到:http://dict.cn/big5/fanout
5....射频开关二极管高频大功率PIN二极管轴向引线封装二极管射频...WP-94142 L500A MDL-WP-94142 L500A DGTL PLUG IN FLEXENT* WP-94142L5A 109534941 - KIT CONSISTING OF WP-94142L5A AND 4539-504B - 2GB CP WP-94142L5B 109565168 - KIT CONTAINING WP-94142L5B AND PMC610J4 WP-94142L70A ASSY-WP-94142L70A FAN TRAY STL FLEXENT * WP-94142L72 DIGITAL MODU...http://www.rf-china.com/n33/TN.asp
6.林奕涵/数字VLSI电路设计前端工艺和后端工艺,先做晶体管,再进行连线 每层金属、半导体之间使用SIO2进行绝缘 布线是半导体工艺的后端 n well, polysilicon, n+ active, p+ active, Contact, Metal. scaling down(等比例缩小,以1/√2缩小特征尺寸L),提高集成度,可变成本(不包括封测成本)和面积成正比。 https://toscode.gitee.com/haochangzhi/VLSI
1.常见器件封装双列直插封装(英语:dual in-line package) 也称为DIP封装或DIP包装,简称为DIP或DIL,是一种集成电路的封装方式,集成电路的外形为长方形,在其两侧则有两排平行的金属引脚,称为排针。DIP包装的元件可以焊接在印刷电路板电镀的贯穿孔中,或是插入在DIP插座(socket)上。 https://blog.csdn.net/qq_35064811/article/details/131689497
2.何谓先进封装?–ICT百科与FCBGA 封装先切片后键合不同,晶圆级封装是先将整片晶圆封装过程完成后再进行切片,整体效率会高很多。晶圆级封装主要分为 Fan-in 和 Fan-out 两大类。传统的 WLP 封装多采用 Fan-in 型态,应用于低引脚(Pin)数的 IC,整体封装面积相较裸 Die 面积增加不大,成本相对较低。而与 Fan-in 相反,Fanout 凭借其...http://ictbaike.com/2024/02/22/%E4%BD%95%E8%B0%93%E5%85%88%E8%BF%9B%E5%B0%81%E8%A3%85%EF%BC%9F/
3.从faninfanout看setup和holdtimeviolation(1)、减小扇出Fanout,根据上文的分析可以分析Fanout较多时增加Net_delay,不利于时序收敛。减小扇出的方法有: a、寄存器复制,几个寄存器复制原先的驱动信号,分担原本由一个寄存器驱动的多个模块。 b、设置Max_Fanout,在代码中设置信号属性,将对应的Max_Fanout设置为一个合理的值,当实际中fanout超过此值时,综合器极性...https://cloud.tencent.com/developer/article/1652987
4.晶通(高邮)集成电路有限公司怎么样晶通(高邮)集成电路有限公司(以下简称“公司”)成立于2021年1月,是*的以晶圆级扇出型(fanout)先进封装技术为平台的Chipletintegration方案商,也是同时掌握晶圆级扇入型FanIn、晶圆级扇出型Fanout、FlipChip倒装以及Chipletintegration等多种先进封装技术的企业。公司主要产品类型包括单芯片Fanout封装、多芯片FanoutSIP集成封装...https://www.jobui.com/company/17331485/
5.RabbitMQ第二天从整体功能上来说,Quorum队列是在Classic经典队列的基础上做减法,因此对于RabbitMQ的长期使用者而言,其实是会影响使用体验的。它与普通队列的区别: 从官方这个比较图就能看到,Quorum队列大部分功能都是在Classic队列基础上做减法,比如Non-durable queues表示是非持久化的内存队列。Exclusivity表示独占队列,即表示队列只能由...https://www.jianshu.com/p/c348ccc48496
6.PCB线路设计及制前作业27、FanOutWiring/FaninWiring扇出布线/扇入布线 指QFP四周焊垫所引出的线路与通孔等导体,使焊妥零件能与电路板完成互连的工作。由于矩形焊垫排列非常紧密,故其对外联络必须利用矩垫方圈内或矩垫方圈外的空地,以扇形方式布线,谓之“扇出”或“扇入”。更轻薄短小的密集PCB,可在外层多安置一些焊垫以承接较多零件,...https://www.ic37.com/htm_news/2008-1/2868_170558.htm