python微服务开发第一课:python实现微服务
一:WSGI标准
(一)什么是WSGI
Web服务器网关接口(Python Web Server Gateway Interface,缩写为WSGI)是为Python语言定义的Web服务器和Web应用程序或框架之间的一种简单而通用的接口。自从WSGI被开发出来以后,许多其它语言中也出现了类似接口。
(二)特点
多线程,WSGI服务器允许运行一个线程池,来并发服务多个请求,但是不可能运行几千个线程,一旦线程池耗尽,那么微服务只能等待后端服务响应,下一个请求还是会被阻塞。
关于线程的知识点见:python高级知识点里面的线程池的原理及应用。
假如:在flask的返回值前面加上input等阻塞操作,那么是不是这个执行线程就会一直在这里等着,那么线程池里面有一个线程就一直被阻塞着。
from flask import Flask,jsonify app = Flask(__name__) app.config["JSON_AS_ASCII"] = False @app.route("/index") def index(): # input("输入文字") return jsonify({"msg":"欢迎访问网站"}) if __name__ == '__main__': app.run(debug=True)
当input存在时,网页一直处于等待服务器响应状态
当注释input后,网页立即显示响应的内容
说明:flask中的请求也是同步进行,遇到阻塞就会停下来等。假如线程池里面的所有线程都遇到了阻塞操作,怎么办?
怎么解决使得flask变成异步,遇到input,依然能够给浏览器返回数据?
二:greenlet和gevent模块
异步编程的原则是:让进程处理多个并发执行的上下文来模拟并行处理方式。
并发:同一时间处理一个任务,
关于异步编程的知识见:python高级知识点里面的异步编程与同步编程。
greenlet函数:基础知识点见:python高级知识点协程
from greenlet import greenlet def test1(x,y): z = gr2.switch(x + y) # 第一步先执行:x="hello" y="world" print(z) # 第四步执行:打印z=42 def test2(u): print(u) # 第二步执行:u="hello world" gr1.switch(42) # 第三步执行: z = 42,相当于 send(42)来启动协程一样 gr1 = greenlet(test1) gr2 = greenlet(test2) gr1.switch("hello","world") # 结果 helloworld 42
上面greenlet可以看出,gr1和gr2可以进行互相切换,切换的原理是,switch方法,相当于协程里面的next或者send
greenlet是显示切换,且还要手动切换,会使得代码变得混乱和难以理解。
此时gevent就闪亮登场了,因为它是隐士切换,你看不见的,最关键的是,自动切换。
gevent是使用了socket模块,通过socket里面的数据准备,使得底层的greenlet暂停或者继续执行,更加神奇的是,monkey patch功能,能够让gevent模块里面的socket替换标准库里面的socket.
from gevent import monkey monkey.patch_all()
# TODO
# TODO