From bdde7cd0b36945aa24ff59640d330e1176376071 Mon Sep 17 00:00:00 2001 From: Johan Ruuskanen <johan.ruuskanen@control.lth.se> Date: Fri, 1 Oct 2021 14:49:33 +0200 Subject: [PATCH] Add flask example with an asynchronous load generator --- flask_server/load_generator.py | 45 +++++++++++++++++++++++++++ flask_server/requirements_loadgen.txt | 2 ++ flask_server/requirements_server.txt | 2 ++ flask_server/server.py | 26 ++++++++++++++++ 4 files changed, 75 insertions(+) create mode 100644 flask_server/load_generator.py create mode 100644 flask_server/requirements_loadgen.txt create mode 100644 flask_server/requirements_server.txt create mode 100644 flask_server/server.py diff --git a/flask_server/load_generator.py b/flask_server/load_generator.py new file mode 100644 index 0000000..972f5d6 --- /dev/null +++ b/flask_server/load_generator.py @@ -0,0 +1,45 @@ + +import aiohttp +import asyncio + +import time + +url = "http://129.192.81.161:5000/" + +sleep_time = 0.25 +T_end = 10 + +async def send_request(session, count): + t_send = time.time() + async with session.post(url, json={'sleep-time':0.5}) as response: + data = await response.json() + t_resp = time.time() + print("{}, resp: {}, rt: {:10.4f}".format(count, \ + data['sleep-time-return'], t_resp - t_send)) + +async def main(loop): + async with aiohttp.ClientSession() as session: + tasks = set() + + t0 = time.time() + t_prev= t0 + + t = 0 + count = 0 + while t < T_end: + + dt = time.time() - t_prev + waittime = max(sleep_time - dt, 0) + + await asyncio.sleep(waittime) + t_prev = time.time() + + tasks.add(loop.create_task(send_request(session, count))) + count += 1 + t = time.time() - t0 + + await asyncio.wait(tasks) + +if __name__ == '__main__': + loop = asyncio.get_event_loop() + tasks = loop.run_until_complete(main(loop)) diff --git a/flask_server/requirements_loadgen.txt b/flask_server/requirements_loadgen.txt new file mode 100644 index 0000000..47b7b33 --- /dev/null +++ b/flask_server/requirements_loadgen.txt @@ -0,0 +1,2 @@ +aiohttp==3.6.2 +asyncio==3.4.3 diff --git a/flask_server/requirements_server.txt b/flask_server/requirements_server.txt new file mode 100644 index 0000000..8da51da --- /dev/null +++ b/flask_server/requirements_server.txt @@ -0,0 +1,2 @@ +flask==1.1.2 +gunicorn==20.0.4 \ No newline at end of file diff --git a/flask_server/server.py b/flask_server/server.py new file mode 100644 index 0000000..de12e6a --- /dev/null +++ b/flask_server/server.py @@ -0,0 +1,26 @@ +# To start as an FCFS queue, use +# gunicorn --bind 0.0.0.0:5000 server:app --log-level info --workers 1 --worker-class sync +# +# For more gunicorn worker settings, see https://docs.gunicorn.org/en/latest/design.html + +import time +from flask import Flask, request + +app = Flask(__name__) + +@app.route('/', methods=['GET', 'POST']) +def main(): + if request.method == 'POST': + data = request.json + time.sleep(data['sleep-time']) + print(data['sleep-time']) + return {'sleep-time-return': 2*data['sleep-time']} + + return ''' + <!doctype html> + <title>A simple flask server</title> + <h1>A simple flask server</h1> + ''' + +if __name__ == "__main__": + app.run(host='0.0.0.0', port=5000) \ No newline at end of file -- GitLab