Python3.6 AttributeError: модуль 'asyncio' не имеет атрибута 'run' - PullRequest
0 голосов
/ 13 октября 2018

Я пытался прочитать https://hackernoon.com/asynchronous-python-45df84b82434. Речь идет об асинхронном питоне, и я попробовал код из этого, но я получаю странную ошибку.Код: `

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

Ответы [ 2 ]

0 голосов
/ 13 октября 2018

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()
0 голосов
/ 13 октября 2018

Функция asyncio.run() была добавлена ​​в Python 3.7.Из документации по asyncio.run() функциям :

Новое в версии 3.7: Важно : эта функция была добавлена ​​в asyncio в Python 3.7 на временной основе.

Обратите внимание на предварительную часть ;сопровождающие Python предвидят, что функция может нуждаться в дальнейшей доработке и обновлении, поэтому API может измениться в будущих версиях Python.

В любом случае вы не можете использовать его в Python 3.6.Вам придется обновить или внедрить свой собственный.

Очень простым приближением будет использование loop.run_until_complete():

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

, хотя это игнорирует обработку оставшихся задачэто все еще может быть запущено.См. asyncio.runners исходный код для полной реализации asyncio.run().

...