【问题标题】:asyncio.run fails when loop.run_until_complete works当 loop.run_until_complete 工作时,asyncio.run 失败
【发布时间】:2019-03-29 21:40:47
【问题描述】:

此代码失败:

import asyncio
from motor import motor_asyncio


_client = motor_asyncio.AsyncIOMotorClient()
_db = _client.db

users = _db.users


async def main():
    await users.create_index(
        'login',
        unique=True
    )


if __name__ == '__main__':
    #loop = asyncio.get_event_loop()
    #loop.run_until_complete(main())
    asyncio.run(main())

出现此错误:

Traceback (most recent call last):
  File "/home/sanyash/myrepos/TKP/db.py", line 21, in <module>
    asyncio.run(main())
  File "/usr/local/lib/python3.7/asyncio/runners.py", line 43, in run
    return loop.run_until_complete(main)
  File "/usr/local/lib/python3.7/asyncio/base_events.py", line 584, in run_until_complete
    return future.result()
  File "/home/sanyash/myrepos/TKP/db.py", line 14, in main
    unique=True
RuntimeError: Task <Task pending coro=<main() running at /home/sanyash/myrepos/TKP/db.py:14> cb=[_run_until_complete_cb() at /usr/local/lib/python3.7/asyncio/base_events.py:158]> got Future <Future pending cb=[run_on_executor.<locals>._call_check_cancel() at /usr/local/lib/python3.7/motor/frameworks/asyncio/__init__.py:80]> attached to a different loop

当我用loop 取消注释两行并注释asyncio.run 时效果很好。什么事?我认为asyncio.run 是这两行的快捷方式。

问题出在motor_asyncio 实现中,因为当我将main 更改为简单的return 42 时,asyncio.run 也能正常工作。

【问题讨论】:

    标签: python python-asyncio python-3.7 motor-asyncio


    【解决方案1】:

    怎么了?我以为asyncio.run 是这两个的捷径 行。

    不,它做得更多。特别是它creates and sets 一个新的事件循环。这就是你得到错误的原因:AsyncIOMotorClient() 为默认事件循环创建了一些异步内容,但asyncio.run 创建的另一个循环尝试使用它。

    如果你想保留asyncio.run,你应该把初始化的东西移到main()里面:

    # ...
    
    _client = None
    _db = None
    users = None
    
    
    async def main():
        global _client, _db, users
        _client = motor_asyncio.AsyncIOMotorClient()
        _db = _client.db
        users = _db.users
    
        # ...
    

    一般来说,最好在事件循环已设置并运行时开始执行,而不是在模块级别执行操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多