Я пытаюсь научить себя асинхронной функциональности Python. Для этого я создал асинхронный веб-скребок. Я хотел бы ограничить общее количество подключений, которые я открыл, чтобы быть хорошим гражданином на серверах. Я знаю, что семафор - это хорошее решение, а библиотека асинхронно имеет встроенный класс semaphore. Моя проблема заключается в том, что Python жалуется при использовании yield from
в функции async
, когда вы комбинируете и await
синтаксис. Ниже приведен точный синтаксис я использую ...Python asyncio.semaphore в async-await function
import asyncio
import aiohttp
sema = asyncio.BoundedSemaphore(5)
async def get_page_text(url):
with (yield from sema):
try:
resp = await aiohttp.request('GET', url)
if resp.status == 200:
ret_val = await resp.text()
except:
raise ValueError
finally:
await resp.release()
return ret_val
Возводя это исключение:
File "<ipython-input-3-9b9bdb963407>", line 14
with (yield from sema):
^
SyntaxError: 'yield from' inside async function
Некоторые из возможных решений я могу думать ...
- Просто используйте
@asyncio.coroutine
декоратора - Использовать threading.Semaphore? Это похоже на то, что это может вызвать другие проблемы.
- Попробуйте это в бета-версии Python 3.6 для причины this.
Я очень новичок в асинхронной функциональности Python, поэтому мне не хватало чего-то очевидного.
Еще лучше, вы можете использовать инструкцию 'async with':' async with sema: [...] ' – Vincent
Async также интересен для меня, я нашел вашу тему интересной и проголосовал за ее оставить здесь. Кстати, не могли бы вы поделиться всем кодом для ex на github? –
Да, я сделаю это и опубликую ссылку в комментариях чуть позже. –