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, поэтому я мог упустить что-то очевидное.

Ответы на вопрос(2)

Ваш ответ на вопрос