首页 > 解决方案 > 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。

标签: asynchronousrustrust-tokio

解决方案


正如错误消息所述,Tokio 不允许您拥有嵌套的运行时。

Tokio 的文档中有一个部分Mutex说明了以下内容(链接):

[它] 可以并且通常首选在异步代码中使用标准库中的普通 Mutex。[...] 异步互斥锁相对于阻塞互斥锁提供的特性是可以将互斥锁保持锁定在一个.await点上,这对于数据来说很少需要。

此外,来自 Tokio 的mini-Redis示例:

Tokio 互斥锁主要用于需要跨.await屈服点持有锁的情况。所有其他情况通常最好由 std 互斥锁来解决。如果临界区不包括任何异步操作但很长(CPU 密集型或执行阻塞操作),那么整个操作,包括等待互斥体,都被认为是“阻塞”操作,tokio::task::spawn_blocking 应该使用。

如果这是您在同步调用中Mutex唯一需要的东西,最好将其设为阻塞。在这种情况下,您可以通过首先调用将其锁定在代码之外,如果失败,则尝试通过 将其锁定在阻塞上下文中。asyncMutexasynctry_lock()spawn_blocking


推荐阅读