Python3.6 AttributeError: 模块‘ syncio’没有属性‘ run’

我试着读 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'>
118246 次浏览

The asyncio.run() function was added in Python 3.7. From the 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.

Note the provisional part; the Python maintainers forsee that the function may need further tweaking and updating, so the API may change in future Python versions.

At any rate, you can't use it on Python 3.6. You'll have to upgrade or implement your own.

A very simple approximation would be to use loop.run_until_complete():

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

although this ignores handling remaining tasks that may still be running. See the asyncio.runners source code for the complete asyncio.run() implementation.

asyncio.run is a Python 3.7 addition. In 3.5-3.6, your example is roughly equivalent to:

import asyncio


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

Just in case this is useful to someone else but for me the issue was my file was called asyncio.py. I renamed it to asyncio_example.py and it started to work again (it was failing at the import statement for asyncio).

This issue helped me realize this: https://github.com/tornadoweb/tornado/issues/2868

If anyone is having a problem with no current loop try:

loop = asyncio.**new**_event_loop()


result = loop.run_until_complete(coro)