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

时间:2018-10-13 19:38:29

标签: python python-3.6 python-asyncio

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

let isSome = (list, req) => {
    return (list.some(v => v.x === req))
}

当我尝试运行时说:

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))

我没有任何名为ayncio的文件,并且有证明:

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

2 个答案:

答案 0 :(得分:15)

asyncio.run是Python 3.7的新增功能。在3.5-3.6中,您的示例大致等效于:

import asyncio

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

答案 1 :(得分:8)

在Python 3.7中添加了asyncio.run()函数。来自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