我尝试阅读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
答案 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。