< 返回版块

heliping 发表于 2022-11-09 11:30

希望使用一个1对多的channel,通知多个worker中的某一个停止。

发送某个worker的id号,当worker收到了,并且和自己的id一致,就停止工作。

使用发现,通过crossbeam_channel这个信道发送,worker接收是随机的。

id可能被某一个id不一致的worker随机收到,停止不成功。

那这个crossbeam_channel的使用场景是什么啊?

还以为这个多对多,是广播模式。

评论区

写评论
作者 heliping 2022-11-10 20:05

最后用watch channel搞定了,多谢大神。

--
👇
johnmave126: 我记得tokio的sync::broadcast是你要的效果,但是不记得sync生态圈有没有类似的了

johnmave126 2022-11-10 12:04

我记得tokio的sync::broadcast是你要的效果,但是不记得sync生态圈有没有类似的了

作者 heliping 2022-11-09 17:49

这么想确实是这么用的,牛,多谢大佬解惑。

--
👇
Easonzero: 用于任务级并行的, 多个相同的无上下文任务, 争抢输入数据, 并无序送输出.

--
👇
heliping: 看了github的issue,貌似确实不支持,

实在不明白如果广播不支持,那这个多对多的场景是什么?有点鸡肋。

Unfortunately, you can't. That would be possible using the bus crate.

Alternatively, you could create a channel per subscriber, hold a Vec<Sender<T>> on the producer side, and then send a copy of the message for each subscriber.
作者 heliping 2022-11-09 17:12

请问下,需要一个全局可变的变量。

因为是web后台的服务,开始和停止是不同的handler。需要共享一个全局的可变的共享变量。 这样worker轮询这个变量,停止的handler写着变量,然后worker读到就停止。 发现rust这个变量好难啊。 lazy和once_cell这种好像只支持一次初始化。

使用直接静态,报错,const call non-const。

--
👇
songzhi: 如果只是为了通知worker停止工作,搞一个原子变量worker那边去轮询或者条件变量worker那边去等待就可以了。

Easonzero 2022-11-09 15:26

用于任务级并行的, 多个相同的无上下文任务, 争抢输入数据, 并无序送输出.

--
👇
heliping: 看了github的issue,貌似确实不支持,

实在不明白如果广播不支持,那这个多对多的场景是什么?有点鸡肋。

Unfortunately, you can't. That would be possible using the bus crate.

Alternatively, you could create a channel per subscriber, hold a Vec<Sender<T>> on the producer side, and then send a copy of the message for each subscriber.
作者 heliping 2022-11-09 13:37

看了github的issue,貌似确实不支持,

实在不明白如果广播不支持,那这个多对多的场景是什么?有点鸡肋。

Unfortunately, you can't. That would be possible using the bus crate.

Alternatively, you could create a channel per subscriber, hold a Vec<Sender<T>> on the producer side, and then send a copy of the message for each subscriber.
songzhi 2022-11-09 11:49

如果只是为了通知worker停止工作,搞一个原子变量worker那边去轮询或者条件变量worker那边去等待就可以了。

1 共 7 条评论, 1 页