python多进程变成学习之multiprocessing

本文介绍了Python中的全局解释器锁(GIL)及其限制,阐述了为何Python多线程无法充分利用多核优势。接着,详细探讨了multiprocessing包,包括Process、Lock、Event、Pipe和Queue等组件,以及多进程启动方式如spawn、fork和forkserver的差异。通过实例展示了如何使用multiprocessing实现进程间的同步和通信,以提升多核系统的性能。
摘要由CSDN通过智能技术生成

Python解释器有一个全局解释器锁(PIL—— Global Interpreter Lock),导致每个phthon进程中最多同时运行一个线程,因此Python多线程程序并不能改善程序性能,不能体现多核系统的优势。

什么是全局解释器锁GIL?

Python代码的执行由Python 虚拟机(也叫解释器主循环,CPython版本)来控制,Python 在设计之初就考虑到要在解释器的主循环中,同时只有一个线程在执行,即在任意时刻,只有一个线程在解释器中运行。对Python 虚拟机的访问由全局解释器锁(GIL)来控制,正是这个锁能保证同一时刻只有一个线程在运行。
多线程环境中,Python虚拟机的工作方式:

1. 设置GIL
2. 切换到一个线程去运行
3. 运行:
    * 指定数量的字节码指令或者线程主动让出控制(可以调用time.sleep(0))

4. 把线程设置为睡眠状态
5. 解锁GIL
6. 再次重复以上所有步骤

multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python内部编写的函数。该Process对象与Thread对象的用法相同,也有start(),run(),join()方法。此外multiprocessing保重也有Lock/Event/Semphore/Condition类(这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同明类一直。所以,multiprecessing的很大一部分与threading使用同一套API。multiprocessing可以有效的利用子进程,因此多处理器模块允许程序员充分利用多处理器,
使用共享api的注意事项:

* 在Unix平台上,当某个进程终结之后,该进程需要被其父进程调用wait,否则进程成为僵尸进程(Zombie)。所以,有必要对每个Process对象调用join方法(实际上等同于wait)。对于多线程来说,由于只有一个进程,多以不存在此必要性。
* multiprocessing提供了threading包中没有的IPC(比如pipe和queue),效率更高。应优先考虑pipe和queue,避免使用Lock/Event/Semaphore/Condition等同步方式(因为它们占据的不是用户进程的资源)。
* 多进程应该避免共享资源。在多线程中,我们可以比较容易的共享资源,比如使用全局变量或者传递参数。在多进程情况下,由于每个进程有自己独立的内存空间,以上方法并不合适。因此我们可以通过共享内存和Manager的方式在共享资源。但这样做提高了程序的复杂度,并因为同步的需要而减低了程序的效率。
* Process.PID中保存有PID,如果进程还没有start(),则PID为None.

快速安装:

pip install mutiprocessing

multiprocessing支持三种启动流程,分别为‘spawn’,‘fork’,“forkserver”

spawn

父进程启动一个新的Python解释器, 子进程将只继承运行run()方法所需的资源。不继承父进程不必要的文件描述符和句柄(一种特殊的只能指针)。与使用fork或forkserver相比,使用此方法启动进程相当慢。在Unix和Windows上可用,Windows上为默认。

fork

父进程使用os.fork()来分叉Python解释器,子进程开始时,与父进程实际上是相同的。父进程所有资源都由子进程继承。这不能保证多线程的安全问题

forkserver

当程序启动并选择forkserver start方法时,将启动服务器进程。从那时起,每当需要新进程时,父进程连接到服务器,并请求它分配一个新进程。叉服务器进程是单线程的,因此它可以安全使用os.fork()。没有不必要的资源被继承。
如果要选择启动方法,必须在主模块中使用set_start_method方法,如:

if __name__ == '__main__':
     multiprocessing.set_start_method('spawn')    

公共属性:

multiprocessing.curre
  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值