在 Thread 中使用 asyncio 的问题

2024-04-02

如下使用asyncio没有问题。

import asyncio


async def main():
    await asyncio.sleep(1)
    aaa = 1
    print (aaa)


loop = asyncio.get_event_loop()
loop.run_until_complete(main())
loop.close()

但是,我必须在 Thread 中使用 asyncio,如下面的简单代码所示,这会导致错误如下

import asyncio
import threading

async def main():
    await asyncio.sleep(1)
    aaa = 1
    print (aaa)


def test():
    loop = asyncio.get_event_loop()
    loop.run_until_complete(main())
    loop.close()


t=threading.Thread(target=test)
t.start()

错误消息(运行时错误:线程“Thread-1”中没有当前事件循环。)

Exception in thread Thread-1:
Traceback (most recent call last):
  File "D:\Anaconda3\Lib\threading.py", line 932, in _bootstrap_inner
    self.run()
  File "D:\Anaconda3\Lib\threading.py", line 870, in run
    self._target(*self._args, **self._kwargs)
  File "D:/Test/Test4/main.py", line 57, in test
    loop = asyncio.get_event_loop()
  File "D:\Anaconda3\Lib\asyncio\events.py", line 639, in get_event_loop
    raise RuntimeError('There is no current event loop in thread %r.'
RuntimeError: There is no current event loop in thread 'Thread-1'.

如何在线程中使用 asyncio?

这对我来说非常重要。 我已经为这个问题苦苦挣扎了两天。

我将不胜感激你的帮助。


除非您需要使用预先存在的事件循环(此处不是这种情况)或支持 Python 3.6,use asyncio.run https://docs.python.org/3/library/asyncio-task.html#asyncio.run而不是手动处理循环:

def test():
    asyncio.run(main())

这始终确保存在有效的事件循环,并且还处理正确的清理。

该函数总是创建一个新的事件循环并在最后关闭它。它应该用作 asyncio 程序的主要入口点,并且最好只被调用一次。


组合时请注意asyncio对于线程,事件循环通常应该在主循环中运行(参见例如业务流程外包#34697 https://bugs.python.org/issue34679)。而不是生成一个线程asyncio,更喜欢为程序的同步部分生成一个。

# launch synchronous work in child threads
t=threading.Thread(target=my_sync_tasks)
t.start()

# launch asynchronous work in main thread
asyncio.run(main())
t.join()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Thread 中使用 asyncio 的问题 的相关文章

随机推荐

  • 从 Jquery AJAX 调用返回响应 [重复]

    这个问题在这里已经有答案了 我编写了一个函数 它必须检查用户名是否已被占用 现在 当我从另一个函数调用该函数时 并警告它的返回值 alert checkusernameavailable justausername 它说 未定义 我到处搜索
  • ColdFusion 在我的 Ajax 中调试输出

    如果我关闭 调试输出设置 下的第三个选项 启用请求调试输出 那么我将不再在我的应用程序中获取调试信息 ajax调用 CFCaccess remote 这很好 但我想对所有其他程序保持打开状态 并针对这一例外情况以编程方式关闭它 我放
  • SonarQube 内部 H2 数据库的默认凭据?

    我正在运行 SonarQube 5 6 1 并尝试保存我创建的视图 为此 我想看一下 Sonar 根据它自己的自述文件 用于内部嵌入式数据库的 H2 DB 我已经运行了 H2 jar 文件 并且在控制台中能够登录到虚拟数据库 如果 Sona
  • 简单(但具体)的侦听器和发送器 Python 3 DBus 示例

    我想制作一个由两部分组成的程序 一个监听者 服务器 如果你愿意的话 和一个发送者 客户端 我做了一些研究 了解到这是通过程序员调用 IPC 进程间通信 的方法来完成的 我相信您知道它的意思 我只是扩展了缩写词 以便您知道我不认为它意味着 互
  • Flutter 返回分类选项卡和项目的列表

    我是颤振新手 我正在尝试实现菜单 如本示例所示https pub dev packages scrollable list tabview https pub dev packages scrollable list tabview 我的食
  • DexArchiveBuilderException:无法处理/xxx/.gradle/caches/transforms-1/files-1.1/play-services-location-11.2.2.aar

    当我尝试编译我的项目时 我收到这个奇怪的错误 What went wrong Execution failed for task android transformClassesWithDexBuilderForProdDevelopmen
  • PostgreSQL 物化视图无法从 Python 刷新

    我在 TimescaleDB 时间序列数据的 PostgreSQL 扩展 中创建了一个物化视图 当我使用 PGAdmin 中的以下代码刷新它时 会添加最新数据 一切正常 REFRESH MATERIALIZED VIEW CONCURREN
  • 如何让车把布局在 node/hapi.js 中工作

    我无法在 hapi js 应用程序中渲染车把布局 布局渲染得很好 但部分根本不渲染 只有空白 我这样声明 var handlebars require handlebars layouts require handlebars layout
  • 最好有数百列或分成多个表?

    我正在设计一个有关机械设备运行的统计数据库 每批数据将包含数百个统计信息 因此我试图决定是创建一个包含数百列的单个表还是将其拆分为多个表 每个表都包含相关的统计信息 例如 我可以有一个表包含与故障相关的统计信息 另一张表包含与堵塞相关的统计
  • 包反向依赖检查(尤其是在 Windows 上)

    我想听听人们现在如何在 Windows 上进行反向依赖检查 使用 官方 但仍处于实验阶段的功能时tools check packages in dir 正如 Windows 上的 CRAN 存储库策略 1 所建议的那样 根据来源检查反向依赖
  • 在div内滚动大图像

    我在一个小 div 内有一个大图像 该 div 内有 4 个箭头来控制移动 右 下 左 上 箭头用于在较小的 div 内移动图像 这是JS代码 slide right click function inner img animate rig
  • 张量流中的权重和偏差初始化

    我正在做一些电力负荷预测 其中我想初始化权重和偏差 我使用不同的算法计算了权重和偏差并将其保存在文件中 我想使用该文件并使用这些重量和偏差开始训练 这是我要更新的代码 RNN designning tf reset default grap
  • jQuery 点击事件多次触发

    我正在尝试用 Javascript 编写一个视频扑克游戏 作为了解其基础知识的一种方式 但我遇到了 jQuery 单击事件处理程序多次触发的问题 它们附在用于下注的按钮上 并且在游戏过程中第一手牌下注时效果很好 仅触发一次 但在第二手牌的投
  • 一个列表框的许多元素到另一个列表框

    这是我第一次使用这种媒介寻求帮助 我想知道如何在我的代码中包含两个列表框 一个查询数据库 然后通过一个按钮将其发送到另一个 并使用多个选项来执行此操作 然后如 php 代码中所示 将第二个列表框中的数据放入表数据库中 谢谢
  • 使用 IPython 嵌入 Python:WindowsError:[错误 193] %1 不是有效的 Win32 应用程序

    尝试运行 include
  • EmberJS/HandlebarsJS 的自定义 for 循环助手

    两个小时前我开始 嵌套 HandlebarsJS each 助手与 EmberJS 不起作用 https stackoverflow com questions 10306063 nested handlebarsjs each helpe
  • 在 jQuery 中执行 ajax 请求时延迟加载微调器

    我在 jQuery 代码中执行 AJAX 请求时使用以下模型来显示加载微调器 jQuery ajaxSetup beforeSend function loader show complete function loader hide su
  • 在 Angular 2 组件中使用 jquery/jqueryui 等库的正确方法

    我对这个主题进行了一些研究 并发现了需要用于打字稿的库的类型 我努力寻找的是用法示例 比如说 Angular 2 应用程序中的 jquery 这里有一些问题 1 人们会在哪里编写 jQuery 代码 是在类内部还是在该类的构造函数内部 2
  • 如何仅将背景颜色设置为 UILabel 文本

    我正在使用应用程序 我需要设置标签 如附加图像 如果有人有任何想法 请告诉我 你可以这样做 NSString yourString1 What Does your friends really NSString yourString2 Th
  • 在 Thread 中使用 asyncio 的问题

    如下使用asyncio没有问题 import asyncio async def main await asyncio sleep 1 aaa 1 print aaa loop asyncio get event loop loop run