当前位置: 首页 > 知识库问答 >
问题:

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

逄念
2023-03-14

我有以下问题:我试图从Async函数调用Sync闭包,但是Sync闭包以后必须调用另一个Async函数。

我无法创建异步闭包,因为它们目前不稳定:错误[E0658]:异步闭包不稳定

所以我得以某种方式这样做。

我发现了几个与该问题相关的问题,例如,但是当我试图实现它时,我收到了以下错误:

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。

共有1个答案

赵辉
2023-03-14

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

Tokio的mutex文档中有一节说明了以下内容(链接):

[它]在异步代码中使用标准库中的普通互斥体是可以的,而且通常是首选的。[...]异步互斥互斥在阻塞互斥互斥上提供的特性是,可以通过.await点锁定互斥互斥,这对于数据来说是很少必要的。

此外,从Tokio的迷你Redis示例来看:

Tokio互斥体主要用于需要跨.await持有锁时。所有其他情况通常最好由std互斥体提供。如果临界部分不包括任何异步操作,但是很长(CPU密集型或执行阻塞操作),那么整个操作(包括等待互斥体)都被视为“阻塞”操作,并且应该使用Tokio::Task::spawn_blocking

如果mutex同步调用中唯一需要的async,那么最好将其设置为阻塞的mutex。在这种情况下,可以通过首先调用try_lock()Async代码锁定它,如果失败,则尝试通过spawn_blocking将它锁定在阻塞上下文中。

 类似资料:
  • 问题内容: 首先,这是一个非常特殊的情况,它以错误的方式故意将异步调用改型为一个非常同步的代码库,该代码库长成千上万行,并且当前时间不具备进行更改的能力。对的。” 它伤害了我的每一个生命,但是现实和理想往往并没有相互融合。我知道这很糟糕。 好的,顺便说一句,我该如何做,这样我可以: 示例(或缺少示例)全部使用库和/或编译器,这两种库均不适用于此解决方案。我需要一个如何使其冻结的具体示例(例如,在调

  • 我正试图从同步方法运行异步方法。但是我不能等待异步方法,因为我在同步方法中。我一定不理解TPL,因为这是我第一次使用它。 每个方法都需要前一个方法来完成,因为第一个方法的数据用于第二个方法。 Await运算符只能在异步方法中使用。考虑用'async'修饰符标记此方法,并将其返回类型更改为'task' 但是,如果我使用async修饰符,这将是一个异步操作。因此,如果我对的调用没有使用await运算符

  • 同步调用异步方法最安全的方法是什么?

  • 问题内容: 假设您维护一个公开一个函数的库。您的用户调用它来获取实际数据: 数据被保存在文件中,因此您可以使用内置的Node.js来实现。很明显这两个和是同步的功能。有一天,您被告知将基础数据源切换到只能异步访问的仓库(例如MongoDB)。还被告知要避免惹恼您的用户,API不能更改为仅返回promise或要求回调参数。您如何满足这两个要求? 使用回调/承诺的异步功能是JavasSript和Nod

  • 我正在为一家德国公司评估Dart,将各种Java程序移植到Dart,并对结果进行比较和分析。在浏览器中,飞镖轻松获胜。对于服务器来说,软件性能似乎是一个严重的问题(请看我的这个问题),但这基本上得到了缓解。 现在我正在移植一些“简单”的命令行工具,我没想到会有任何严重的问题,但至少有一个问题。一些工具确实会发出HTTP请求来收集一些数据,独立的Dart虚拟机只以异步方式支持它们。纵观所有我能找到的

  • 问题内容: 我有一个异步函数,要连续多次调用。问题是“多个”可以是几十万或数百万… 显而易见的方法是从回调中调用相同的函数,如下所示: 当然,涉及一些逻辑来停止递归。问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 问题答案: 问题是堆栈是否充满了调用,并可能在某些时候导致堆栈溢出? 否。 如果调用回调是异步传递的,则不会堆积堆栈。 在您的代码中: 这是逐步发生的事情: 首先被称为。 然后