[英]rust tokio: calling async function from sync closure
我有以下问题:我正在尝试从async
function 调用sync
关闭,但sync closure
必须稍后调用另一个async
function。
我无法进行异步闭包,因为它们目前不稳定: 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's Mutex
的文档中有一个部分说明了以下内容( 链接):
[它] 可以并且通常首选在异步代码中使用标准库中的普通 Mutex。 [...] 异步互斥锁相对于阻塞互斥锁提供的特性是可以将互斥锁锁定在一个
.await
点上,这对于数据来说很少需要。
此外,来自 Tokio 的mini-Redis示例:
Tokio 互斥锁主要用于需要跨
.await
屈服点持有锁的情况。 所有其他情况通常最好由 std 互斥锁来解决。 如果临界区不包含任何异步操作但很长(CPU 密集型或执行阻塞操作),那么整个操作,包括等待互斥锁,都被认为是“阻塞”操作,并且tokio::task::spawn_blocking
应该是用过的。
如果Mutex
是您在同步调用中唯一需要的async
内容,则最好将其设为阻塞Mutex
。 在这种情况下,您可以通过首先调用try_lock()
将其从async
代码中锁定,如果失败,则尝试通过spawn_blocking
将其锁定在阻塞上下文中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.