This project will help you understand how Asynchronous and Synchronous frameworks performs using single thread.
- Flask (Synchronous)
- Starlette (Asynchronous)
Here we will start both app using single worker thread using gunicorn. Both the app have two endpoints.
-
{base_url}/sleeper
sleeper is an example of blocking code that takes large time to execute (in example 10 seconds). These blocking could be due to io bound actions like database interactions, network calls, etc.
-
{base_url}/activer
activer is simple get request that takes virtually no time to execute.
Now the difference that you'll feel is that, using asynchronous framework like starlette, you'll be able to execute more requests on single thread. Internally it uses an event-loop to achieve this, more on this at documentation.
Clone this repository and run both apps. Check how both the system behaves when sleeper is called first and then activer (within 10 seconds).
Create a virtualenv. You can use any method, one of the easiest method is to use python-virtualenv
virtualenv -p python3.x .venv
Activate the virtualenv
source .venv/bin/activate
Install dependencies
pip install -r requirements.txt
Flask is a synchronous framework i.e. it runs the code in synchronous fashion. More about this on documentation
To run flask app, simply execute run.sh which will execute following bash command
gunicorn -w 1 -b 127.0.0.1:8002 app:app
App will run on port 8002 so url endpoints will be
Starlette is an asynchronous framework i.e. it runs code inside an event loop. More about this on documentation
To run starlette app, simply execute run.sh which will execute following bash command
gunicorn -w 1 -k uvicorn.workers.UvicornWorker -b 127.0.0.1:8001 app:app
App will run on 8001 so url endpoints will be
If some issue persist, make sure caching is not enabled in the browser. You can also test it using curl command as:
curl -XGET <url>
I really hope you'll grasp the knowledge and will gain curiousity for async-await. If you feel you've understood a little better, give a thumps up to this project. :D