Другой способ - использовать очередь и создать 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