【问题标题】:Python3.6 AttributeError: module 'asyncio' has no attribute 'run'Python3.6 AttributeError:模块'asyncio'没有属性'run'
【发布时间】:2019-03-18 16:40:21
【问题描述】:

我试图阅读https://hackernoon.com/asynchronous-python-45df84b82434。 这是关于异步python的,我尝试了这个代码,但我得到了一个奇怪的错误。 代码是: `

import asyncio
import aiohttp

urls = ['http://www.google.com', 'http://www.yandex.ru', 'http://www.python.org']

async def call_url(url):
    print('Starting {}'.format(url))
    response = await aiohttp.ClientSession().get(url)
    data = await response.text()
    print('{}: {} bytes: {}'.format(url, len(data), data))
    return data

futures = [call_url(url) for url in urls]

asyncio.run(asyncio.wait(futures))

当我尝试运行它时说:

Traceback (most recent call last):
  File "test.py", line 15, in <module>
    asyncio.run(asyncio.wait(futures))
AttributeError: module 'asyncio' has no attribute 'run'
sys:1: RuntimeWarning: coroutine 'call_url' was never awaited

我没有任何名为 ayncio 的文件,但我有证据:

>>> asyncio
<module 'asyncio' from '/usr/lib/python3.6/asyncio/__init__.py'>

【问题讨论】:

    标签: python python-3.6 python-asyncio


    【解决方案1】:

    asyncio.run 是 Python 3.7 的新增功能。在 3.5-3.6 中,你的例子大致相当于:

    import asyncio
    
    futures = [...]
    loop = asyncio.get_event_loop()
    loop.run_until_complete(asyncio.wait(futures))
    

    【讨论】:

    • 当你抓住现有的事件循环时,我不会关闭它。asyncio.run() 只是关闭循环,因为它实际上创建了一个新循环开始。
    • 您可能希望使用asyncio.gather 而不是asyncio.wait 来实际使用期货并处理异常。
    【解决方案2】:

    asyncio.run() 函数是在 Python 3.7 中添加的。来自asyncio.run() function documentation

    3.7 版中的新功能:重要提示:此功能已临时添加到 Python 3.7 的 asyncio 中。

    注意provisional part; Python 维护者预见到该函数可能需要进一步调整和更新,因此 API 可能会在未来的 Python 版本中发生变化。

    无论如何,你不能在 Python 3.6 上使用它。您必须自己升级或实施。

    一个非常简单的近似是使用loop.run_until_complete()

    loop = asyncio.get_event_loop()
    result = loop.run_until_complete(coro)
    

    尽管这忽略了处理可能仍在运行的剩余任务。有关完整的 asyncio.run() 实现,请参阅 asyncio.runners source code

    【讨论】:

      【解决方案3】:

      以防万一这对其他人有用,但对我来说,问题是我的文件被称为asyncio.py。我将它重命名为 asyncio_example.py,它又开始工作了(它在 asyncio 的导入语句中失败了)。

      这个问题帮助我意识到这一点:https://github.com/tornadoweb/tornado/issues/2868

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-10
        • 2019-04-14
        • 1970-01-01
        • 2017-05-30
        • 2016-12-26
        • 1970-01-01
        • 2018-04-14
        • 2019-02-18
        相关资源
        最近更新 更多