Go编程艺术异步读写网络连接
在Go中,读写channel与读写Conn是的不一样的。一个协程可以通过select监听并读写多个channel, 但却不能类似这样监听并读写多个Conn(除非自行封装epoll)。如果想在一个协程中监听并读写多个channel和Conn, 那更不好办了。一般的方式是使用专门的协程来处理Conn的读写,使其转换为channel,以供主协程多路监听读写。
由于Conn读写都会阻塞协程,一般情况下,需要两个协程。一个用来读,一个用来写。此时一定要处理好读写的错误,要及时地关闭掉Conn,并退出两个协程,释放掉资源。
这里示例一下处理方法:
转化读写Conn为chan的收发func process(conn net.Conn, reqch chan<- Request, rspch <-chan Response) { var wg sync.WaitGroup ctx, cancel := context.WithCancel(context.Background()) // 写 wg.Add(1) go func() { defer wg.Done() for { select { case req := <-reqch: _, err := conn.Write(req.Marshal()) if err != nil { conn.Close() return } // 处理数据 // ... } case <-ctx.Done(): // 读协程已关闭conn, 写协程需要立即退出。 return } }() // 读 go func() { defer wg.Done() rbuf := make([]byte, 1024) for { rlen, err := conn.Read(rbuf) if err != nil{ if err != net.ErrClosed() { conn.Close() // 及时通知写协程 cancel() } return } rsp := Unmarshal(rbuf[:rlen]) // 处理数据 // ... rspch <- rsp } }() wg.Wait() }
需要注意的是context,这个能保证两个协程的协调退出。写协程写的时候出错,关闭掉Conn,退出;读协程会立即发现Conn已被关掉,退出。读协程读的时候出错,关闭掉Conn,cancel(), 退出。写协程立即发现Conn已被关闭,立即退出。
关键的点在于,如果不用context, 写协程只有在下次Write的时候才能发现Conn已被关闭,而这个"下次",不知道是什么时候。
这样就把对Conn的读写转化为了两个chan,主协程只需要两个chan通信。func processProxy() { var conn net.Conn var reqch chan Request var rspch chan Response // ... go process(conn, reqch, rspch) select { case reqch <- req: // send case rsp := <-rspch: // recv default: // ok } }
当然,示例程序也不完美。比如,往reqch发送的时候,可以用一个函数封装一下,及时发现chan已满,发送报错。
农村幼儿教育与城市教育,差距在哪些方面?幼儿教育,是指对36岁年龄阶段的幼儿所实施的教育。幼儿教育则是幼儿园和其他专门开设的幼儿教育机构的教育。幼儿园教育在中国属于学校教育系统,和学校教育一样,幼儿园教育也具有家庭教育和
中国在戈壁滩上新建了一座城市,成立仅3年,里面的人咋生活?城市的出现,在人类的历史上是一个重大的转折点。城市,是指人类聚集在一起而形成的大型聚集地,具有行政划分的边界线。早在原始社会时期,原始人为了提高狩猎成功率也为了增强安全性,多人自发
义乌小商品成就大城市在买商品,卖商品中快速发展,如今已成全球最大日用商品批发市场义乌小商品成就大城市阅读提示由鸡毛换糖起步,义乌就在这种买商品,卖商品中快速发展。随着中欧班列的开通电子商务的发展,义乌
目前的股市到底出现一种什么样的节奏?最近以岭药业为首的中药真的是热到爆,很多人都喊出了一年几百亿利润,以岭药业几千亿市值的幻想。其实每当市场有疯子出现,或者社会上人人谈论一样东西的时候,基本已经到了最为高潮的时候,也
欧洲三大芯片制造商表态遵守对华出口限制但无计划停止在华业务集微网消息,据金融时报报道,由于美国加大半导体出口管制全球供应链变得复杂,欧洲芯片制造商正在寻求在中国的业务稳定。意法半导体英飞凌和恩智浦半导体的首席执行官近日表示,虽然他们遵守美
跨境电商早报亚马逊更新美国销售佣金和FBA费用凯德盟知识产权读早报知行情觅商机1。亚马逊更新美国销售佣金和FBA费用亚马逊美国站发布公告称,从2023年1月17日起将更新美国销售佣金和FBA费用,销售佣金将保持不变,燃油和通货
和大客户暴雪分手,网易为什么不在乎?今天是单仁行陪伴您的第2425天最近互联网公司的瓜是一个接一个,马斯克刚入主推特就发起裁员,Facebook和亚马逊也不声不响的紧随其后。瓜还没吃利索,两家著名的游戏公司暴雪和网易
京东方入股荣耀终端,对市场和产品会有什么影响?荣耀作为去年才完成独立的新品牌,其股东结构本身就比价复杂。有深圳国资背景股东,也有原属于华为的部分供应商渠道商,而且荣耀仅仅用1年的时间占据了国内前三的市场地位,荣耀现在是一只下金
今日封顶!INXNI以内母公司银星智能佛山市研发产业基地大有来头2022年11月17日上午,全屋智能机器人赛道新锐品牌IXNI以内母公司银星智能集团的佛山市研发产业基地项目(下称项目)封顶仪式在顺德圆满举行。佛山市委常委顺德区委书记刘智勇,顺德
美国科技公司的默契大裁员文荀诗林美国裁员,裁疯了。美国10月挑战者企业裁员人数录得3。3843万人,为2021年2月以来新高,前值为2。9989万人,环比增加12。85,同比增加48。29。根据媒体不完全
呼市耳钉姐是清白的吗?或许内蒙这家公司给出了答案文清茶与田园自从耳钉姐在疫情发布会上因一对价值3万的耳钉走红后,从此围绕她的话题就不断了。说起来她这也算自带光芒,一分钱没花,热度媲美大明星。她的热度为何一直居高不下呢,我认为是她