we can launch parallel tasks with python concurrent.futures
to double the speed.
here is the original code with one thread one_thread.py:
import flask
import json
import time
app = flask.Flask(__name__)
def read_file():
time.sleep(0.1)
return "file result"
def read_db():
time.sleep(0.2)
return "db result"
def read_api():
time.sleep(0.3)
return "api result"
@app.route("/")
def index():
result_file = read_file()
result_db = read_db()
result_api = read_api()
return json.dumps({
"result_file": result_file,
"result_db": result_db,
"result_api": result_api,
})
if __name__ == "__main__":
app.run(host='0.0.0.0')
import flask
import json
import time
app = flask.Flask(__name__)
def read_file():
time.sleep(0.1)
return "file result"
def read_db():
time.sleep(0.2)
return "db result"
def read_api():
time.sleep(0.3)
return "api result"
@app.route("/")
def index():
result_file = read_file()
result_db = read_db()
result_api = read_api()
return json.dumps({
"result_file": result_file,
"result_db": result_db,
"result_api": result_api,
})
if __name__ == "__main__":
app.run(host='0.0.0.0')
import flask import json import time app = flask.Flask(__name__) def read_file(): time.sleep(0.1) return "file result" def read_db(): time.sleep(0.2) return "db result" def read_api(): time.sleep(0.3) return "api result" @app.route("/") def index(): result_file = read_file() result_db = read_db() result_api = read_api() return json.dumps({ "result_file": result_file, "result_db": result_db, "result_api": result_api, }) if __name__ == "__main__": app.run(host='0.0.0.0')
and another one multiple_threads.py
import flask
import json
import time
from concurrent.futures import ThreadPoolExecutor
app = flask.Flask(__name__)
pool = ThreadPoolExecutor()
def read_file():
time.sleep(0.1)
return "file result"
def read_db():
time.sleep(0.2)
return "db result"
def read_api():
time.sleep(0.3)
return "api result"
@app.route("/")
def index():
result_file = pool.submit(read_file)
result_db = pool.submit(read_db)
result_api = pool.submit(read_api)
return json.dumps({
"result_file": result_file.result(),
"result_db": result_db.result(),
"result_api": result_api.result(),
})
if __name__ == "__main__":
app.run(host='0.0.0.0')
import flask
import json
import time
from concurrent.futures import ThreadPoolExecutor
app = flask.Flask(__name__)
pool = ThreadPoolExecutor()
def read_file():
time.sleep(0.1)
return "file result"
def read_db():
time.sleep(0.2)
return "db result"
def read_api():
time.sleep(0.3)
return "api result"
@app.route("/")
def index():
result_file = pool.submit(read_file)
result_db = pool.submit(read_db)
result_api = pool.submit(read_api)
return json.dumps({
"result_file": result_file.result(),
"result_db": result_db.result(),
"result_api": result_api.result(),
})
if __name__ == "__main__":
app.run(host='0.0.0.0')
import flask import json import time from concurrent.futures import ThreadPoolExecutor app = flask.Flask(__name__) pool = ThreadPoolExecutor() def read_file(): time.sleep(0.1) return "file result" def read_db(): time.sleep(0.2) return "db result" def read_api(): time.sleep(0.3) return "api result" @app.route("/") def index(): result_file = pool.submit(read_file) result_db = pool.submit(read_db) result_api = pool.submit(read_api) return json.dumps({ "result_file": result_file.result(), "result_db": result_db.result(), "result_api": result_api.result(), }) if __name__ == "__main__": app.run(host='0.0.0.0')
run curl command to compare the real time spend:
output from one_thread.py:
ubuntu@ubuntu2020:~$ time curl http://192.168.0.171:5000
{"result_file": "file result", "result_db": "db result", "result_api": "api result"}
real 0m0.629s
user 0m0.009s
sys 0m0.013s
output from multiple_threads.py:
ubuntu@ubuntu2020:~$ time curl http://192.168.0.171:5000
{"result_file": "file result", "result_db": "db result", "result_api": "api result"}
real 0m0.328s
user 0m0.014s
sys 0m0.010s
the real time is dropped from 629ms to 328ms with multiple threads!
output from one_thread.py:
ubuntu@ubuntu2020:~$ time curl http://192.168.0.171:5000
{"result_file": "file result", "result_db": "db result", "result_api": "api result"}
real 0m0.629s
user 0m0.009s
sys 0m0.013s
output from multiple_threads.py:
ubuntu@ubuntu2020:~$ time curl http://192.168.0.171:5000
{"result_file": "file result", "result_db": "db result", "result_api": "api result"}
real 0m0.328s
user 0m0.014s
sys 0m0.010s
the real time is dropped from 629ms to 328ms with multiple threads!
output from one_thread.py: ubuntu@ubuntu2020:~$ time curl http://192.168.0.171:5000 {"result_file": "file result", "result_db": "db result", "result_api": "api result"} real 0m0.629s user 0m0.009s sys 0m0.013s output from multiple_threads.py: ubuntu@ubuntu2020:~$ time curl http://192.168.0.171:5000 {"result_file": "file result", "result_db": "db result", "result_api": "api result"} real 0m0.328s user 0m0.014s sys 0m0.010s the real time is dropped from 629ms to 328ms with multiple threads!