asynchronous - 同步/异步互操作通道
问题描述
当您希望跨线程(以线程阻塞方式)发送一系列事物时,您有例如crossbeam_channel
. 当您希望跨期货发送一系列事物时(以非线程阻塞、未来阻塞的方式),您有例如tokio::sync::mpsc
.
什么能让我从阻塞线程发送,并从异步上下文接收?(顺便说一句,我可以想象在某些时候需要相反的情况。)
我需要限制通道,发送时线程阻塞,接收时阻塞未来。
我正在寻找一些高性能的东西,比如相当于在 中所做的crossbeam_channel
,但是唤醒未来而不是线程,能够缓冲一些消息以避免尽可能多的阻塞。此处针对多消息场景给出的答案看起来有点像这方面的修补程序。
解决方案
自从提出此问题以来,Tokio 提供的频道已获得执行此操作的功能。当您在非异步代码中时,您可以简单地调用通道上的blocking_send
and方法:blocking_recv
let (mut tx, mut rx) = tokio::sync::mpsc::channel(10);
std::thread::spawn(move || {
// send a value, blocking synchronously
// this allows async channels to be used in non-async contexts
tx.blocking_send("testing").unwrap();
});
// receive a value, blocking asynchronously
assert_eq!(rx.recv().await.unwrap(), "testing");
推荐阅读
- node.js - SailsJS / Vue / Node:发送到 EJS 页面时未定义变量
- python - Django:尽管有“prefetch_related”,但在相关查询集上使用“.first()”会触发查询。有解决方法吗?
- ios - Swift 键盘出现到文本字段移动无法正常工作
- node.js - Nodejs将相同的启动类共享给子路由
- c# - 值元组中包含的属性的默认值
- intellij-idea - (Kotlin) Intellij IDEA 中注释处理的任何解决方法
- r - 学习者应用程序在闪亮的服务器上不起作用
- wordpress - Wordpress WooCommerce Rest-API 覆盖项目架构
- php - 基于 PHP 的 Telegram 机器人 InlineKeyboardMarkup 不起作用
- javascript - 下拉菜单元素失去对选项卡的关注