現在我有一個后臺執行緒,我正在使用通道與之通信。細節并不重要,但我有enum Message一個變體Variant(Data, Sender<Response>),所以在后臺執行緒中我可以這樣做:
loop {
match message_rx.recv() {
Ok(Message::Variant(data, sender)) => {
let result = do_something(data);
sender.send(result);
}
}
}
在前臺執行緒中,
let (response_rx, response_tx) = flume::bounded(1);
message_tx.send(Message::Variant(data, response_tx));
let response = response_rx.recv();
這個解決方案不是并發的(這里的并發也不是一個特定的目標)但它實際上是一個解決方案嗎?我受到 Erlang 模式的啟發,在該模式中,行程將其 pid 與訊息一起發送,以便它可以接收回應。
uj5u.com熱心網友回復:
這確實是一種模式,就像在您的示例中一樣,在訊息中嵌入回復通信通道是一種很好的方法,
您可以為它找到不同的實用程式,例如在使用 tokio 的異步環境中,您可以使用oneshot,這是一個確保單個訊息的通道,來自示例:
use tokio::sync::oneshot;
#[tokio::main]
async fn main() {
let (tx, rx) = oneshot::channel();
tokio::spawn(async move {
if let Err(_) = tx.send(3) {
println!("the receiver dropped");
}
});
match rx.await {
Ok(v) => println!("got = {:?}", v),
Err(_) => println!("the sender dropped"),
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/481885.html
