1、使用自身服务器的多进程或者多线程,参考werkzeug的run_simple函数的入参。注意,进程和线程不能同时开启
2、使用gunicorn使用多进程,-w worker 进程数,类型于运行多个app.run()开发服务器
gunicorn app -w 2 -b :8000
3、使用gevent异步
/usr/local/bin/gunicorn -t120 -w10 -b 10.57.17.57:3000 --worker-class gevent Erebus:APP
-k STRING, --worker-class STRING
The type of workers to use. [sync]
-w INT, --workers INT
The number of worker processes for handling requests.
[1]
-t INT, --timeout INT
Workers silent for more than this many seconds are
killed and restarted. [30]
-b ADDRESS, --bind ADDRESS
The socket to bind. [[‘127.0.0.1:8000‘]]
当运行开发服务器时,运行app.run(),你会得到一个单一的同步进程,这意味着一次最多只能处理1个请求。
通过在其默认配置中坚持Gunicorn在它的前面,只是增加 – 工作,你获得的本质上是一些进程(由Gunicorn管理),每个行为像app.run()开发服务器。 4个worker == 4个并发请求。这是因为Gunicorn默认使用它包含的同步工作类型。
重要的是要注意,Gunicorn还包括异步工作,即eventlet和gevent(和龙卷风,但是最好使用Tornado框架,似乎)。通过使用–worker-class标志指定其中一个异步工作者,您所获得的是Gunicorn管理多个异步进程,每个进程管理自己的并发。这些进程不使用线程,而是协同程序。基本上,在每个进程内,每次只能发生一件事情(1个线程),但是当对象在等待外部进程完成时(可以考虑数据库查询或等待网络I / O),它们可以被“暂停”。
这意味着,如果你使用Gunicorn的异步工作者,每个工作者可以一次处理多个请求。只有多少工人是最好的取决于你的应用程序的性质,它的环境,它运行的硬件等等。更多的细节可以在Gunicorn’s design页和notes on how gevent works在其介绍页上找到。