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