我有以下问题:
我正在尝试从 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.'
这里是 playground link,希望可以显示我遇到的问题。
我正在使用标题中所述的 tokio。
答案 0 :(得分:0)
正如错误消息所述,Tokio 不允许您拥有嵌套的运行时。
Tokio 的 Mutex
文档中有一个部分说明以下内容 (link):
[It] 没问题,通常更喜欢在异步代码中使用标准库中的普通互斥锁。 [...] 与阻塞互斥锁相比,异步互斥锁提供的功能是可以将互斥锁锁定在 .await
点上,这对于数据来说很少需要。
此外,来自 Tokio 的 mini-Redis 示例:
<块引用>Tokio 互斥锁主要用于需要持有锁的情况
跨越 .await
个屈服点。所有其他情况通常最好
由 std 互斥锁提供服务。如果临界区不包括任何
异步操作但很长(CPU 密集型或执行阻塞
操作),然后是整个操作,包括等待互斥锁,
被视为“阻塞”操作,tokio::task::spawn_blocking
应该使用。
如果 Mutex
是您在同步调用中唯一需要的 async
东西,则很可能将其设为阻塞 Mutex
。在这种情况下,您可以通过首先调用 async
从 try_lock()
代码锁定它,如果失败,则尝试通过 spawn_blocking
将其锁定在阻塞上下文中。