import aiohttp
import asyncio
from queue import Queue, Empty
class Request(object):
def __init__(self, url, callback=None):
self.url = url
self.callback = callback
class Response(object):
def __init__(self, body):
self.body = body
class Reactor(object):
def __init__(self):
self.loop = asyncio.get_event_loop()
self.task_queue = Queue()
def run(self):
self.loop.run_until_complete(self.run_loop())
@asyncio.coroutine
def run_loop(self):
while True:
try:
task = self.task_queue.get(block=False)
except Empty:
pass
else:
@asyncio.coroutine
def perform_request():
print('Requesting {}'.format(task.url))
io_res = yield from aiohttp.request('get', task.url)
body = yield from io_res.text()
res = Response(
body=body,
)
if task.callback:
task.callback(task, res)
yield from perform_request()
print('sleeping')
yield from asyncio.sleep(0.1)
def add_task(self, task):
self.task_queue.put(task)
def process_response(req, res):
print('Result of request to {}'.format(req.url))
print('Response content:')
print(res.body)
def main():
reactor = Reactor()
req = Request('http://httpbin.org/ip', callback=process_response)
reactor.add_task(req)
reactor.run()
if __name__ == '__main__':
main()