ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python – 异常“在新循环上运行时,线程’MainThread’中没有当前事件循环

2019-05-22 17:43:03  阅读:816  来源: 互联网

标签:python python-3-x python-asyncio python-3-5 event-loop


这是简单的测试代码和结果.

import asyncio

async def test():
    await asyncio.sleep(1)

if __name__ == '__main__':

    asyncio.set_event_loop(None)      # Clear the main loop.
    loop = asyncio.new_event_loop()   # Create a new loop.
    loop.run_until_complete(test())   # Run coroutine over the new loop
Traceback (most recent call last):
  File "test_test.py", line 11, in <module>
    loop.run_until_complete(test())
  File "/usr/lib/python3.5/asyncio/base_events.py", line 387, in run_until_complete
    return future.result()
  File "/usr/lib/python3.5/asyncio/futures.py", line 274, in result
    raise self._exception
  File "/usr/lib/python3.5/asyncio/tasks.py", line 239, in _step
    result = coro.send(None)
  File "test_test.py", line 5, in test
    await asyncio.sleep(1)
  File "/usr/lib/python3.5/asyncio/tasks.py", line 510, in sleep
    loop = events.get_event_loop()
  File "/usr/lib/python3.5/asyncio/events.py", line 632, in get_event_loop
    return get_event_loop_policy().get_event_loop()
  File "/usr/lib/python3.5/asyncio/events.py", line 578, in get_event_loop
    % threading.current_thread().name)
RuntimeError: There is no current event loop in thread 'MainThread'.

我在新循环上运行异步def测试(),并期望由test()嵌套的asyncio.sleep(1)也使用新循环.

与此相反,sleep()似乎仍然可以访问我设置为None的主循环.

我知道在调用run_until_complete()之前我可以使用asyncio.set_event_loop(循环)将主循环重新设置为新循环,并且它将无异常地工作.

但是,我想知道asyncio是正常的,主循环必须设置并用于协同程序,而不管运行协同程序的循环.

解决方法:

I want to know it is normal for asyncio that main loop Must be set and is used for coroutines regardless of a loop over which coroutine is run.

过去在Python 3.6之前需要这样做.原因是像asyncio.sleep()这样的函数需要一个事件循环才能使用loop.call_later()来安排唤醒调用以完成未来.

从Python 3.6(或3.5.3,包括the issue的修复)开始,当从事件循环驱动的协同程序调用get_event_loop()时,它总是返回驱动它的事件循环.因此,您的代码可以正常工作.

这由以下句子in the documentation涵盖:

An exception to this rule happens when get_event_loop() is called from a running future/coroutine, in which case it will return the current loop running that future/coroutine.

标签:python,python-3-x,python-asyncio,python-3-5,event-loop
来源: https://codeday.me/bug/20190522/1153236.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有