赞
踩
定义了一个装饰器 async 和 A 、B 两个function 函数,A 里面sleep 10s , 然后打印 a function 字符串 ,B 里面直接打印 b function 字符串 ,我们顺序调用两个功能: A() ,B( )
由于函数A在睡的状态,我们又不希望程序被阻塞在函数A的睡的状态,所以我们采用异步执行,即在函数A睡的状态,让其他的任务执行
from threading import Thread from time import sleep def async(f): def wrapper(*args, **kwargs): thr = Thread(target=f, args=args, kwargs=kwargs) thr.start() return wrapper @async def A(): sleep(10) print("函数A睡了十秒钟。。。。。。") print("a function") def B(): print("b function") A() B()
执行结果:
b function
函数A睡了十秒钟。。。。。。
a function
1、通过设置app.run()的参数,来达到多线程的效果,具体参数:
# 1、threaded : 多线程支持,默认为False,即不开启多线程;
app.run(threaded=True)
# 2、processes:进程数量,默认为1.
app.run(processes=True)
ps:多进程或多线程只能选择一个,不能同时开启
2、解决方案: flask+gevent
安装gevent
pip install gevent
pip install gevent-websocket
pip install flask
修改代码
# -*- coding:utf-8 -*- import time,asyncio from flask import Flask,request,Response from gevent import monkey from gevent.pywsgi import WSGIServer # 在玩websockets,可以无视之哈,有空贴下flask websockets实现哈 from geventwebsocket.handler import WebSocketHandler #pip install gevent-websocket #gevent的猴子魔法 monkey.patch_all() app = Flask(__name__) # app.config.update(DEBUG=True) @app.route('/asyn/1/', methods=['GET']) def test_asyn_one(): if request.method == 'GET': asyncio.sleep(10) return 'hello asyn' @app.route('/test/', methods=['GET']) def test(): return 'hello test' if __name__ == "__main__": """ 使用flask自带的传递参数threaded与processes,也可以实现异步非阻塞,但是这个原理是 同时开启多个线程或者多个进程来接受发送的请求,每个线程或者进程还是阻塞式处理任务 如果想使用threaded或processes参数,必须将debug设置为False才能生效,不然不起作用 同时Windows下不支持同时开启多进程,所以在win下使用processes无效 """ # app.run(host='0.0.0.0', port=10008, debug=False, threaded=True, processes=5) http_server = WSGIServer(('0.0.0.0', 5000), app, handler_class=WebSocketHandler) http_server.serve_forever()
运行之后可以先访问/asyn/1/再访问/test/,可以明显发现,/asyn/1/在做耗时任务时不会影响其他请求
为什么要加monkey.patch_all()
这一条语句呢?在gevnet的官网有详细的解释,这里简单说明一下:
monkey carefully replace functions and classes in the standard socket module with their cooperative counterparts. That way even the modules that are unaware of gevent can benefit from running in a multi-greenlet environment.
翻译:猴子补丁仔细的用并行代码副本替换标准socket模块的函数和类,这种方式可以使模块在不知情的情况下让gevent更好的运行于multi-greenlet环境中。
Flask 依赖两个外部库: Jinja2 模板引擎和 Werkzeug WSGI 套件
@flask_script扩展
pip install flask-script
# 导入类库
from flask_script import Manager
# 创建对象
manager = Manager(app)
# 启动应用实例
if __name__ == '__main__':
#app.run(debug=True, threaded=True, port=8000, host='0.0.0.0')
manager.run()
启动参数
-?,–help # 查看帮助信息
–threaded # 开启多线程
-d # 开启调试模式
-r # 自动加载
-h,–host # 指定主机
-p,–port # 指定端口
在命令行使用
python manage.py runserver -d -r -p 8000 -h 0.0.0.0
开启多线程
python manage.py runserver -p 8000 -h 0.0.0.0 --threaded
参考:
https://www.cnblogs.com/sui776265233/p/10950001.html
https://blog.csdn.net/danny_amos/article/details/50859383
https://blog.csdn.net/yannanxiu/article/details/52915929
https://blog.csdn.net/u012089823/article/details/85264084
https://www.jianshu.com/p/79489cfc6fb9
https://blog.csdn.net/qq_39222965/article/details/80654546
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。