asynchronous - rust tokio:从同步闭包中调用异步函数
问题描述
我有以下问题:我试图sync
从函数调用闭包async
,但sync closure
必须稍后调用另一个async
函数。
我无法进行异步关闭,因为它们目前不稳定:
error[E0658]: async closures are unstable
所以我必须以某种方式这样做。
我发现了一些与该问题相关的问题,例如this,但是当我尝试实现它时,我收到以下错误:
Cannot start a runtime from within a runtime.
This happens because a function (like `block_on`)
attempted to block the current thread while the
thread is being used to drive asynchronous tasks.'
这是游乐场链接,希望可以显示我遇到的问题。
如标题所述,我正在使用 tokio。
解决方案
正如错误消息所述,Tokio 不允许您拥有嵌套的运行时。
Tokio 的文档中有一个部分Mutex
说明了以下内容(链接):
[它] 可以并且通常首选在异步代码中使用标准库中的普通 Mutex。[...] 异步互斥锁相对于阻塞互斥锁提供的特性是可以将互斥锁保持锁定在一个
.await
点上,这对于数据来说很少需要。
此外,来自 Tokio 的mini-Redis示例:
Tokio 互斥锁主要用于需要跨
.await
屈服点持有锁的情况。所有其他情况通常最好由 std 互斥锁来解决。如果临界区不包括任何异步操作但很长(CPU 密集型或执行阻塞操作),那么整个操作,包括等待互斥体,都被认为是“阻塞”操作,tokio::task::spawn_blocking
应该使用。
如果这是您在同步调用中Mutex
唯一需要的东西,最好将其设为阻塞。在这种情况下,您可以通过首先调用将其锁定在代码之外,如果失败,则尝试通过 将其锁定在阻塞上下文中。async
Mutex
async
try_lock()
spawn_blocking
推荐阅读
- python - 合并 2 个字典并将它们存储在 pandas 数据框中,其中一个字典具有可变长度列表元素
- python - 无法在 Python 中将 Matlab 时间戳转换为日期时间
- sql-server - 如何在名称中创建具有动态约束 UUID 的临时表
- android - 是否有适用于 Wear OS 应用程序的时间选择器小部件?
- html - 如何使用 CSS 将单词换到下一行?
- c# - 在特定单词之后以字符串格式提取部分 URL
- javascript - HTML / CSS - 如何使覆盖视频文本完全响应?
- swift - 从硬编码转换为从 plist 读取
- php - 我需要在 MacOSX 上使用 php 连接一个 php MyAdmin MySQL 数据库,但它无法连接
- excel - Excel 中的用户表单错误更新小数记录时