Jir*_*til 22 python python-asyncio python-3.6
我试着阅读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))
Run Code Online (Sandbox Code Playgroud)
当我尝试运行时说:
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
Run Code Online (Sandbox Code Playgroud)
我没有任何名为ayncio的文件,我有证据:
>>> asyncio
<module 'asyncio' from '/usr/lib/python3.6/asyncio/__init__.py'>
Run Code Online (Sandbox Code Playgroud)
Nor*_*ius 25
asyncio.run是Python 3.7的补充.在3.5-3.6中,您的示例大致相当于:
import asyncio
futures = [...]
loop = asyncio.get_event_loop()
loop.run_until_complete(asyncio.wait(futures))
Run Code Online (Sandbox Code Playgroud)
Cha*_*ker 13
以防万一这对其他人有用,但对我来说问题是我的文件被称为asyncio.py. 我将其重命名为asyncio_example.py,它再次开始工作(它在 asyncio 的导入语句中失败)。
这个问题帮助我意识到这一点:https ://github.com/tornadoweb/tornado/issues/2868
Mar*_*ers 11
该asyncio.run()功能已在Python 3.7中添加.从asyncio.run()功能文档:
版本3.7中的新功能:重要:此功能已临时添加到Python 3.7中的asyncio中.
注意临时部分 ; Python维护者认为该函数可能需要进一步调整和更新,因此API可能会在未来的Python版本中发生变化.
无论如何,你不能在Python 3.6上使用它.您必须升级或实施自己的.
一个非常简单的近似是使用loop.run_until_complete():
loop = asyncio.get_event_loop()
result = loop.run_until_complete(coro)
Run Code Online (Sandbox Code Playgroud)
虽然这忽略了处理可能仍在运行的剩余任务.请参阅完整实现的asyncio.runners源代码asyncio.run().