Skip to content

Instantly share code, notes, and snippets.

@imbolc
Created October 28, 2015 09:03
Show Gist options
  • Save imbolc/950423ed434c95b65d72 to your computer and use it in GitHub Desktop.
Save imbolc/950423ed434c95b65d72 to your computer and use it in GitHub Desktop.
Testing of aiohttp + rq performance
'''
I started one server:
$ python aiohttp_rq.py server
And three workers in different terminals:
$ python aiohttp_rq.py worker
And I got next results with ab:
- simple hello world:
sudo ab -n1000 -c10 http://127.0.0.1:8000/hello
Requests per second: 1139.20 [#/sec] (mean)
- aiohttp.get() request to previous hello-world page:
sudo ab -n1000 -c10 http://127.0.0.1:8000/request
Requests per second: 274.53 [#/sec] (mean)
- complete task with python-rq:
sudo ab -n1000 -c10 http://127.0.0.1:8000/task
Requests per second: 185.52 [#/sec] (mean)
'''
import sys
import asyncio
import aiohttp
from aiohttp import web
from redis import Redis
import rq
from rq.decorators import job
rq.use_connection(Redis())
async def run_task(task, *args, loop=None, **kwargs):
'''
Returns job result or None if an error occurs
'''
job = task.delay(*args, **kwargs)
# while True:
for i in range(100000):
print(i)
await asyncio.sleep(0.01, loop=loop)
if job.is_finished:
return job.result
if job.is_failed:
raise Exception('Job is failed')
@job('normal')
def empty_task():
return 'Done'
async def hello_web_handler(request):
return web.Response(text='Hello, world')
async def request_web_handler(request):
async with aiohttp.get('http://127.0.0.1:8000/hello') as r:
result = await r.text()
return web.Response(text=result)
async def task_web_handler(request):
result = await run_task(empty_task)
return web.Response(text=result)
app = web.Application()
app.router.add_route('GET', '/hello', hello_web_handler)
app.router.add_route('GET', '/request', request_web_handler)
app.router.add_route('GET', '/task', task_web_handler)
if __name__ == '__main__':
if len(sys.argv) != 2 or sys.argv[1] not in ('server', 'worker'):
print('Usage: {0} server or {0} worker'.format(__file__))
elif sys.argv[1] == 'server':
loop = asyncio.get_event_loop()
handler = app.make_handler()
f = loop.create_server(handler, '127.0.0.1', 8000)
srv = loop.run_until_complete(f)
print('serving on', srv.sockets[0].getsockname())
loop.run_forever()
else:
with rq.Connection():
qs = list(map(rq.Queue, ['high', 'normal', 'low']))
w = rq.Worker(qs)
w.work()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment