Created
October 28, 2015 09:03
-
-
Save imbolc/950423ed434c95b65d72 to your computer and use it in GitHub Desktop.
Testing of aiohttp + rq performance
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
''' | |
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