rust tokio:从同步闭包调用异步函数

时间:2021-01-21 23:55:52

标签: asynchronous rust 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.'

这里是 playground link,希望可以显示我遇到的问题。

我正在使用标题中所述的 tokio。

1 个答案:

答案 0 :(得分:0)

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

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

<块引用>

[It] 没问题,通常更喜欢在异步代码中使用标准库中的普通互斥锁。 [...] 与阻塞互斥锁相比,异步互斥锁提供的功能是可以将互斥锁锁定在 .await 点上,这对于数据来说很少需要。

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

<块引用>

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

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