簡體   English   中英

Python3.6 AttributeError:模塊'asyncio'沒有屬性'run'

[英]Python3.6 AttributeError: module 'asyncio' has no attribute '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'>

asyncio.run是 Python 3.7 的補充。 在 3.5-3.6 中,您的示例大致相當於:

import asyncio

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

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)

盡管這忽略了處理可能仍在運行的剩余任務。 有關完整的asyncio.run()實現,請參閱asyncio.runners源代碼

以防萬一這對其他人有用,但對我來說問題是我的文件被稱為asyncio.py 我將它重命名為asyncio_example.py並且它再次開始工作(它在 asyncio 的導入語句中失敗)。

這個問題幫助我意識到這一點: https : //github.com/tornadoweb/tornado/issues/2868

如果有人遇到沒有電流循環的問題,請嘗試

循環=異步。 新的_event_loop()

結果 = loop.run_until_complete(coro)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM