< 返回版块

reison1218 发表于 2020-03-28 17:33

众所周知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,但线程之前的通信量也大大减少了(好像比较蠢?) 请大大赐教一下!

评论区

写评论
作者 reison1218 2020-03-29 16:11

谢谢各位的建议!很有帮助!

chenwei767 2020-03-29 10:36

要保证Sender引用大于等于1

phper-chen 2020-03-29 10:20

crossbeam?

jmjoy 2020-03-29 02:20

Sender本身封装了Arc,只要保证Sender引用大于1,它drop的时候channel就不会被close掉的。

1 共 4 条评论, 1 页