异步
对于输入/输出(IO)受限的情况,我们需要使用异步代码,而django默认情况下不是异步的,但是我们可以通过使用带有gevent工作进程和monkey patching的gunicorn来实现:
gunicorn --worker-class=gevent --worker-connections=1000 --workers=3 main:app
2014年的Gunicorn变更日志https://docs.gunicorn.org/en/stable/2014-news.html?highlight=monkey#gevent-worker:
修复:现在在worker中进行猴子补丁。
- 我是否仍需要为我的应用程序打猴子补丁,或者它默认由worker完成?
- gevent如何为我的Django代码实现异步功能?
线程
如果我们有一个CPU密集型任务,则需要使用带有线程的gthread worker:
gunicorn --workers=5 --threads=2 --worker-class=gthread main:app
- 如果我们将此配置用于I/O绑定,它会起作用吗?当一个线程因为I/O而等待时,另一个线程能够工作吗?
- 我看到了(3)中的观点(如果我没错),因为I/O等待时间的原因,但如果这是一个CPU绑定,那么在我们的情况下第二个线程如何帮助我们,或者只有当一个线程没有完全负载核心并且有空余的运行空间时才有帮助?
- 由于GIL,(3)和(4)是无用的吗?例如,有4个人向服务器发送请求,使用1个工作进程和4个线程。 GIL确保只有1个线程在工作。第一个人使用线程1开始处理,其他3个人在等待?那么线程是用来做什么的呢?