Python asyncio.semaphore в функции async-await
Я пытаюсь научить себя асинхронной функциональности Python. Для этого я построил асинхронный веб-скребок. Я хотел бы ограничить общее количество открытых для меня соединений, чтобы быть хорошим гражданином на серверах. Я знаю, что семафоры - хорошее решение, и у библиотеки asyncio естьсемафор встроенный класс. Моя проблема в том, что Python жалуется при использованииyield from
вasync
функционировать как вы комбинируетеyield
а такжеawait
синтаксис. Ниже приведен точный синтаксис, который я использую ...
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
декораторИспользовать нить. Семафор? Кажется, что это может вызвать другие проблемыПопробуйте это в бета-версии Python 3.6 дляэтот причина.Я очень плохо знаком с асинхронной функциональностью Python, поэтому я мог упустить что-то очевидное.