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

posted @ 2019-12-28 22:14  张京墨  阅读(101)  评论(0编辑  收藏  举报