金源在线客服

在线咨询

QQ在线咨询

QQ咨询

关于pythonPython

Python适合大型项目吗?

作者: 更新时间::2023-05-10

例如整个Python应用项目,基于PyPy + Cython、PyPy+RPython编译C扩展这种模式可以构建大型的Pvthon程序项目。但这种项目的环境已经不属于纯Pvthon代码应用的范畴。因为Cvthon是用于Python后端的一种Pvthon和C混编的编程技术,而PyPv和Numba这些带JIT编译器的Pvthon技术引用项目,主要为了解决Python前端性能瓶颈问题。这种PyPy因为自带JIT编译器可以对一些多循环、存在大量局部变量可以Pvthon函数、类方法采取内联优化。直接降级为机器码去独立执行(某些程度下,Cython的cdef关键字也干这种事。区别在PyPy是运行时的即时编译、Cython是静态编译后,运行时加载)。

CPython3.11以及之前不存在“多线程并行”,简称“伪多线程”,“伪线程”可以理解为被“多核并行被功能性压制、被阉割”的线程

这些CPython骨子里的劣根性的源头是GIL,吹嘘Python完美到上天的几乎是不会谈及的话题,这似乎成了影响割韭菜的“禁忌”。在Python项目中要真正根除GIL,目前来说是无可能的。因为在CythonCC++构建的Python软件生态,只要你使用到的轮子涉及到和CPvthon前端交互的,都存在GIL。也就是说,在纯CPython模式无法使用类似JVM,多核并行的多线程技术解决并发的需求。Pvton前端内部是不适合使用纯Pvthon代码写一些多线程运算逻辑的(例如调用threading模块去做一些复杂的CPU密集型的运算操作,简直是做死。会引发无谓的GIL资源抢夺,甚至是线程死锁问题。

但事物有两面的,Python前端更适合的是多并发I/O请求的应用场景。那么异步I/O就有用武之地Pythonasync上下文都是在一个单独主线程的事件循环中完成所有并发I/0的任务的轮询、协同调度、执行。因为在同一个线程内部,就不存在引发多线程争夺GIL资源的问题,从而规避了GIL持有/释放这些高时间成本开销的问题

另外在Pvthon后端内部,更适合处理一些CPU密集型的运算任务,因此,你可以将一些涉及多核并行运算的业务逻辑放到Cvthon中以纯C模式的函数内部,配合with nogil (排除GIL千扰)openMPprange这些手段实现复杂的多线程并行运算。这里说的C模式就是Cvthon中所与涉及并行运算的传入参数、局部变量均不参与Pvthon前端的交互,例如在一个cdef关键字内部、只要函数形参、局部变量、返回值存在静态类型指定,就是所谓的C模式。

说到这里,PyPy /CPython + Cython这种组合,更适用于Python前端异步I/0处理并发请求,将这些请求传递给后端的Cython,而Cython内部并行运算代码处理这些请求,将返回结果经由一个def函数对cdef函数的return操作,将结果重新封装成PvObiect对象返回给Pvthon前端。


上一篇:关于Python学习、就业问题
下一篇:没有了