众所周知rust在线程安全通信上有一些独到之处,比如使用channel,往往在构建一些应用的时候,channel的sender可能因为需求不同会clone多个,那么,如果只有一个呢? 打个比方,tcp服务端,为每个tcpstream都创建一个channel,receiver读取sender的消息采用异步方式,sender可以封装给handler或者业务处理的结构体中,那么问题来了,一旦sender离开生命周期范围,就会drop,那么sender也就失效了,channel也就处于关闭状态了,异步循环读取sender消息的receiver也会随之返回一个error:“receiving on a closed channel”。 有什么比较好的方案解决sender的alive问题吗?目前我想到两个: 1:是心跳机制,每隔一段时间,sender给receiver发送消息以确保channel一直都是工作状态。 2:clone一个sender给receiver,sender和receiver俩一起,要完蛋一起完蛋,只要receiver一直存活,那么与其一起的sender也是存活的,不致于导致channel的close,但线程之前的通信量也大大减少了(好像比较蠢?) 请大大赐教一下!
评论区
写评论谢谢各位的建议!很有帮助!
要保证Sender引用大于等于1
crossbeam?
Sender本身封装了Arc,只要保证Sender引用大于1,它drop的时候channel就不会被close掉的。