Другой способ - использовать очередь и создать N worker для использования очереди.
class Producer(object): def __init__(self, url_queue): self.url_queue = url_queue async def run(self): count = 0 while True: await self.url_queue.put('https://graph.facebook.com/') class Consumer(object): def __init__(self, url_queue, stat): self.url_queue = url_queue async def run(self): connector = aiohttp.TCPConnector(limit=None) async with aiohttp.ClientSession(connector=connector) as session: while True: url = await self.url_queue.get() async with session.get(url) as resp: content = await resp.read() loop = asyncio.get_event_loop() url_queue = asyncio.Queue() producer = Producer(url_queue) tasks = [ asyncio.ensure_future(stat.run()), ] for i in range(worker_count): worker = Consumer(url_queue) tasks.append(asyncio.ensure_future(worker.run())) loop.run_until_complete(asyncio.gather(*tasks)) loop.close()
При таком подходе не нужно использовать семафор и набор задач для ограничения количества загружаемых сопрограмм.
Я создал основу для сравнения двух способов, и кажется, что этот подход немного быстрее по сравнению с вашим пулом задач.
https://gist.github.com/kiennt/a9f850d2aacaed0f7b8c682d34a4aa4b