接收器关闭并在尝试通过通道发送时返回 SendError

Posted

技术标签:

【中文标题】接收器关闭并在尝试通过通道发送时返回 SendError【英文标题】:Receiver closing and returning a SendError on attempt to send over channel 【发布时间】:2018-04-10 06:20:44 【问题描述】:

我正在尝试在两个线程之间建立双向通信:子线程既可以向父线程发送也可以从父线程接收,而父线程既可以向子线程发送也可以从子线程接收。由于 Rust 中的通道是单向的,我使用了一组两个通道,组织方式如下(我自制的线程库中的一个 sn-p):

let (tx, rx) = channel();
let (tx2, rx2) = channel();

(Endpoint 
     sender: tx2,
     receiver: rx,
 ,
 Endpoint 
     sender: tx,
     receiver: rx2,
 )

我的设置函数中的代码如下所示:

let BiChannel 
    e1: world,
    e2: thread,
 = BiChannel::new();

let ws = WorldState 
    ...
    thread_endpoint: thread,
;
std::thread::spawn(threading::handle_life(world));

在这个sn-p中,threading::handle_life函数返回一个move闭包,它使用传递的Endpoint(上面代码中的world)与父线程通信,而父线程使用ws.thread_endpoint与之通信子线程。

我在端点上对send 的所有调用都调用 unwrap,所以如果发送失败,它会崩溃。果然,我收到了如下所示的运行时错误:

thread 'main' panicked at 'called `Result::unwrap()` on an `Err` value: "SendError(..)"', src/libcore/result.rs:860
note: Run with `RUST_BACKTRACE=1` for a backtrace.

这方面的文档非常少,但我几乎不知道只有当频道关闭时才会发生这种情况。

【问题讨论】:

【参考方案1】:

事实证明,问题在于我忘记将子线程中的消息接收代码放入无限循环中,所以一旦它收到第一条消息,它就退出并关闭相应的通道。

【讨论】:

以上是关于接收器关闭并在尝试通过通道发送时返回 SendError的主要内容,如果未能解决你的问题,请参考以下文章

使用线程的数据报通道

MissingPluginException(在通道 flutter_email_sender 上找不到方法发送的实现)

如何关闭多个 goroutine 正在发送的通道?

flutter:应用关闭时通过接收短信弹出通知

tcp四次挥手

尝试发送模板时在 Mandrill 中出现“invalid-sender”错误