flask 并发

Posted wodeboke-y

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了flask 并发相关的知识,希望对你有一定的参考价值。

flask 并发


1. 非并发

非并发时的情况:
注意需要在run中声明threaded=False
对,flask默认启用多线程;而flask_script默认不启用多线程。。。

  
    @app.route("/async")  
    def longtimetask():  
        time.sleep(20)  
        return ‘等待20秒结束。。。‘  

访问/async执行耗时任务,再访问/spider
结果就是正在等待响应,必需等待longtimetask()结束后才能响应下一个请求。

2. 并发-threads,processings

2.1. flask自带并发

flask自带两种并发模式:多线程,多进程
一般用于开发测试。

  
# 1.threaded : 多线程支持,默认为False,即不开启多线程;  
app.run(threaded=True)  
# 2.processes:进程数量,默认为1.  
app.run(processes=True)  

两者不能同时开启。

2.2. 使用genvent做协程

  
from genvent.wsgi import  WSGIServer  
from genvent import monkey  

monkey.patch_all()  
app = Flask(__name__)  
app.config.from_object(config)  
api = Api(app)  

db = DBInfo()  
# db_old = DBInfo_old()  

然后通过这种方式包装WSGIServer((address,port), app).serve_forever()
通过python code.py 的方法,来启动服务

2.3. Guicorn

通过Guicorn(with genvent)的形式来对app进行包装,来启动服务;
代码及启动项目

启动命令

gunicorn -c gun.py thread_explore:app
其中gun.py是gunicorn的配置文件
thread_explore是服务的主程序
app是flask的app
gun.py的具体内容:

  
import os  
import gevent.monkey  
gevent.monkey.patch_all()  
import multiprocessing  

# 服务地址(adderes:port)  
bind = 127.0.0.1;5000  
# 启动进程数量  
workers = multiprocessing.cpu_count() * 2 +1  
worker_class = ‘gevent‘  
threads = 20  
preload_app = True  
reload = True  
x_forwarded_for_header = ‘X_FORWARDED-FOR‘  

ps:这里启动进程数量应该是根据CPU个数来确定的,最好是2 * CPU数 + 1

以上是关于flask 并发的主要内容,如果未能解决你的问题,请参考以下文章

如何从设置中获取数据并发送到此片段

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

Swift新async/await并发中利用Task防止指定代码片段执行的数据竞争(Data Race)问题

golang代码片段(摘抄)

全栈编程系列SpringBoot整合Shiro(含KickoutSessionControlFilter并发在线人数控制以及不生效问题配置启动异常No SecurityManager...)(代码片段

flask 并发