• 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系统下的对比

  • 相关阅读:
    HDU 3401 Trade
    POJ 1151 Atlantis
    HDU 3415 Max Sum of MaxKsubsequence
    HDU 4234 Moving Points
    HDU 4258 Covered Walkway
    HDU 4391 Paint The Wall
    HDU 1199 Color the Ball
    HDU 4374 One hundred layer
    HDU 3507 Print Article
    GCC特性之__init修饰解析 kasalyn的专栏 博客频道 CSDN.NET
  • 原文地址:https://www.cnblogs.com/cwp-bg/p/7465384.html
Copyright © 2020-2023  润新知