#!/usr/bin/env python3 import time import asyncio from aiohttp import ClientSession class Knocker(object): def __init__(self, urls=None, sleep_time=.5): self.urls = urls or [] self.sleep_time = float(sleep_time) async def fetch(self, url, session): async with session.get(url) as response: await asyncio.sleep(self.sleep_time) status = response.status date = response.headers.get("DATE") print("{}:{} with status {}".format(date, response.url, status)) return url, status async def bound_fetch(self, sem, url, session): # Getter function with semaphore. async with sem: await self.fetch(url, session) async def run(self): tasks = [] # create instance of Semaphore sem = asyncio.Semaphore(20) # Create client session that will ensure we dont open new connection # per each request. async with ClientSession() as session: for url in self.urls: # pass Semaphore and session to every GET request task = asyncio.ensure_future(self.bound_fetch(sem, url, session)) tasks.append(task) responses = asyncio.gather(*tasks) await responses