Python3.6 AttributeError:模块“asyncio”没有属性“run”

2024-05-21 00:30:09 发布

您现在位置:Python中文网/ 问答频道 /正文

我试着读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'>

Tags: run代码importcomasynciohttpurldata
2条回答

Python 3.7中添加了asyncio.run()函数。从^{} function documentation

New in version 3.7: Important: this function has been added to asyncio in Python 3.7 on a provisional basis.

请注意,provisional part;Python维护人员认为该函数可能需要进一步调整和更新,因此API可能在将来的Python版本中更改。

无论如何,您不能在Python3.6上使用它。你必须升级或实现你自己的。

一个非常简单的近似方法是使用^{}

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

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

^{}是Python 3.7的附加组件。在3.5-3.6中,您的示例大致相当于:

import asyncio

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

相关问题 更多 >