|
|
- #!/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
-
|