python的multiprocessing模块进程创建、资源回收-Process,Pool

python的multiprocessing有两种创建进程的方式,每种创建方式和进程资源的回收都不太相同,下面分别针对Process,Pool及系统自带的fork三种进程分析。

1.方式一:fork()

举例:

1 import os
2 pid = os.fork() # 创建一个子进程
3 os.wait() # 等待子进程结束释放资源
4 pid为0的代表子进程。

缺点:
1.兼容性差,只能在类linux系统下使用,windows系统不可使用;
2.扩展性差,当需要多条进程的时候,进程管理变得很复杂;
3.会产生“孤儿”进程和“僵尸”进程,需要手动回收资源。
优点:
是系统自带的接近低层的创建方式,运行效率高。

2.方式二:Process进程
举例:

1 import multiprocessing as ms
2 def test():
3 pass
4 p1 = ms.Process(target=test) # 创建子进程
5 p1.start() # 子进程 开始执行
6 p1.join() # 等待子进程结束

特点:
1.注意:Process对象可以创建进程,但Process对象不是进程,其删除与否与系统资源是否被回收没有直接的关系。
2.主进程执行完毕后会默认等待子进程结束后回收资源,不需要手动回收资源;join()函数用来控制子进程
    结束的顺序,其内部也有一个清除僵尸进程的函数,可以回收资源;
3.Process进程创建时,子进程会将主进程的Process对象完全复制一份,这样在主进程和子进程各有一个Process
   对象,但是p1.start()启动的是子进程,主进程中的Process对象作为一个静态对象存在,不执行。
4.当子进程执行完毕后,会产生一个僵尸进程,其会被join函数回收,或者再有一条进程开启,start函数也会回收
僵尸进程,所以不一定需要写join函数。
5.windows系统在子进程结束后会立即自动清除子进程的Process对象,而linux系统子进程的Process对象
如果没有join函数和start函数的话会在主进程结束后统一清除。

另外还可以通过继承Process对象来重写run方法创建进程,这里不再赘述。

3.进程池Pool:

 1 import mutiprocessing as ms
 2 def test():
 3 pass
 4 p1 = Pool(5) # 创建5条进程
 5 for i in range(10):
 6 p1.apply_async(test) # 向进程池添加任务
 7 p1.close() # 关闭进程池,不再接受请求
 8 po.join() # 等待所有的子进程结束
 9 while Ture:
10 pass

分析:
1.如上,进程池Pool被创建出来后,即使实际需要创建的进程数远远大于进程池的最大上限,p1.apply_async(test)代码
   依旧会不停的执行,并不会停下等待;相当于向进程池提交了10个请求,会被放到一个队列中;
2.但是有一点很重要,当执行完p1 = Pool(5)这条代码后,5条进程已经被创建出来了,只是还没有为他们各自
   分配任务,也就是说,无论有多少任务,实际的进程数只有5条,计算机每次最多5条进程并行。

3.当Pool中有进程任务执行完毕后,这条进程资源会被释放,pool会按先进先出的原则取出一个新的请求给空闲的
   进程继续执行;
4.当Pool所有的进程任务完成后,会产生5个僵尸进程,如果主线程不结束,系统不会自动回收资源,需要调用join函数去回收。
5.创建Pool池时,如果不指定进程最大数量,默认创建的进程数为系统的内核数量.

  另外还有一种阻塞式添加任务的方法,p1.apply(test),其每次只能向进程池添加一条任务,然后for循环会被堵塞等待,
直到添加的任务被执行完毕,进程池中的5个进程交替执行新来的任务,相当于单进程了。

进程在windows和linux系统下的对比

时间: 2024-10-27 08:22:40

python的multiprocessing模块进程创建、资源回收-Process,Pool的相关文章

Python并发进程—multiprocessing 模块创建进程

multiprocessing 模块创建进程 进程创建方法 1.流程特点[1] 将需要子进程执行的事件封装为函数[2] 通过模块的Process类创建进程对象,关联函数[3] 可以通过进程对象设置进程信息及属性[4] 通过进程对象调用start启动进程[5] 通过进程对象调用join回收进程 2.基本接口使用 Process() 功能 : 创建进程对象 参数 : target 绑定要执行的目标函数 rgs 元组,用于给target函数位置传参 kwargs 字典,给target函数键值传参 p.

python多进程multiprocessing模块中Queue的妙用

最近的部门RPA项目中,小爬为了提升爬虫性能,使用了Python中的多进程(multiprocessing)技术,里面需要用到进程锁Lock,用到进程池Pool,同时利用map方法一次构造多个process.Multiprocessing的使用确实能显著提升爬虫速度,不过程序交由用户使用时,缺乏一个好的GUI窗口来显示爬虫进度.之前的文章中使用了Chrome浏览器来渲染js脚本生成了进度条.但是鉴于Chrome在运行时十分吃内存资源,用Chrome只是生成一个进度条难免有些“大材小用”,所以,小

python 多进程multiprocessing 模块

multiprocessing 常用方法: cpu_count():统计cpu核数 multiprocessing.cpu_count() active_children() 获取所有子进程 multiprocessing.active_children() preces() 创建一个进程对象 multiprocessing.Preces(target=function_name, args=()) target: 函数名 args: 函数需要的参数,以tuple形式传入,一个参数时需(1,)

python中multiprocessing模块

multiprocess模块那来干嘛的? 答:利用multiprocessing可以在主进程中创建子进程. #该模块和Threading模块使用方法基本类似. 首先需要说明,你所使用多线程的函数不能有return,比如你要将job这个函数多线程那么在job这个函数里就不能有return,如果有返回值请看文章的最后. multiprocessing最好写在if __name__ == '__main__'当中,如果不放在这里面,windows可能会出错.其余环境则不会出现这种情况.我第一个案例没有

python中multiprocessing模块之Pipe管道

multiprocessing.Pipe([duplex]) 返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信.如果duplex=False,conn1只能用来接收消息,conn2只能用来发送消息.不同于os.open之处在于os.pipe()返回2个文件描述符(r, w),表示可读的和可写的 实例如下: #!/usr/bin/python #coding=utf-8 import os from multiprocessing import Process, Pip

Python:线程、进程与协程(5)——multiprocessing模块(2)

上篇博文介绍了Python的multiprocessing模块创建进程Process 类,进程间通信,进程间的同步三个部分,下面接着介绍学习进程共享. (1)内存共享 在多进程情况下,由于每个进程有自己独立的内存空间,怎样能实现内存共享呢?multiprocessing模块提供了Value, Array,这两个是函数,详细定义在sharedctypes.py里,有兴趣的可以去看看(等了解了ctypes模块后回头再分享下我的理解,今天就先放放)   Value Value的初始化非常简单,直接类似

Python进程之multiprocessing模块

python的multiprocessing模块是跨平台的多进程模块,multiprocessing具有创建子进程,进程间通信,队列,事件,锁等功能,multiprocessing模块包含Process,Queue,Pipe,Lock等多个组件. 1.Process 创建进程的类 Process([group [, target [, name [, args [, kwargs]]]]]) 参数介绍:group参数未使用,值始终为Nonetarget表示调用对象,即子进程要执行的任务args表

python多进程-----multiprocessing包

multiprocessing并非是python的一个模块,而是python中多进程管理的一个包,在学习的时候可以与threading这个模块作类比,正如我们在上一篇转载的文章中所提,python的多线程并不能做到真正的并行处理,只能完成相对的并发处理,那么我们需要的就是python的多进程来完成并行处理,把所有的cpu资源都利用起来.multiprocessing的很大一部分与threading使用同一套API,只不过换到了多进程的环境.这里面要注意,对于多进程来说,win32平台和unix平

multiprocessing 模块

multiprocessing模块 进程对象 创建 p = Process(target=foo, args=(param,)) 属性 p.daemon: True为守护进程, 守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic processes are not allowed to have children, 父进程结束则自己也立刻结束; False则为非守护进程, 自身进程运行与父进程是否结束无关; p.daemon = True | False