欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python3的高性能并发编程及web后端架构解决方案

程序员文章站 2022-03-07 15:09:00
总结一下这两天的学习成果--python3的并发编程及web后端架构解决方案GIL受限于不可释放的历史负担,GIL的存在使得一个python解释器(也就是一个进程)在同一时刻只能使用一个cpu内核(也就是同一时刻只能跑一个线程)。多线程(建议使用标准库的threading模块)代表真实的操作系统线程。线程的使用很方便,常见的方法和其他编程语言类似,是从Threading继承,然后override run()方法,在方法里写线程代码。使用的时候 创建线程对象,调用他的start().....

总结一下这两天的学习成果--python3的并发编程及web后端架构解决方案

 

GIL

受限于不可释放的历史负担,GIL的存在使得一个python解释器(也就是一个进程)在同一时刻只能使用一个cpu内核(也就是同一时刻只能跑一个线程)。

 

多线程(建议使用标准库的threading模块)

代表真实的操作系统线程。线程的使用很方便,常见的方法和其他编程语言类似,是从Threading继承,然后override run()方法,在方法里写线程代码。使用的时候 创建线程对象,调用他的start()方法。

Queue 相当于go里的chan,可理解为线程安全队列,支持FIFO和FILO两种形式

有了Threading和Queue其实,多线程编程就基本上OK了。但是前面说到由于GIL的存在,多线程在python里面很鸡肋,尽管在IO密集型的应用场景(当前线程IO忙碌的时候切换到另一个线程运行)多线程还是很有意义的,但是还是太受限了.

于是就出现了

 

多进程(建议使用标准库的multiprocessing模块)

可能是由于多线程在python里面受限,自然而然想到用多进程来解决并发问题,所以python标准库对多进程的封装是我见过的各种语言里面做得最好用的。多进程的创建,进程通信太easy了。而且multiprocessing模块直接仿照threading模块的接口协议设计了多进程的api接口。学习成本非常低。Queue也可以用于多进程通信,此外使用管道pipe通信也非常简单。

 

协程和事件循环

python支持协程,也就是ring3态的低成本线程(没有上下文切换的成本),从3.4版本开始从语言上支持async def和await关键字,用起来也很easy. 当然和golang的协程相比还是差很多。属于可用级别。同样是受限于GIL的设计。python的协程只是和IO事件循环进行搭配,实现在IO密集型场景下的高性能。IO事件循环的编程模式,若不了解,可搜索epoll模型,select模型, libevent库等关键字。

 

结论--python在高并发高性能的IO密集型后端服务应用场景下解决方案--sanic

sanic是一个基于“多进程-async/await-事件循环IO”的开源高性能web server。易用,文档挺全,网上测试结果,性能吊打flask和djiango。当然mvc这些网站开发功能比较弱了。

我们现在使用的 nginx反向代理<===============>go webserver这种模式,可以尝试把go的部分替换成sanic,可以在一些非关键的服务上采用sanic进行尝试,因为python的动态语言灵活性,三方类库多样性,的确比go方便和广大得多。

 

 

本文地址:https://blog.csdn.net/truexf/article/details/109647728