开启进程第二种方式

自定义一个类,继承multiprocess.Process类

例1:

  • 第一种方式是直接创建Process类的对象,用target传函数名就可以了。第二种方式是面向对象开启。
    例1:
from multiprocessing import Process
import os
class MyProcess(Process):    # 直接创建类继承Process类
    def run(self):   # 重写run方法,相当于target内容,func
        print('子进程:', os.getpid(), os.getppid())
if __name__ == '__main__':
    p = MyProcess()
    p.start()   # 在类Process中的start方法中,开启了一个进程,并让这个子进程执行run方法里,而之前target中的函数就是Process类的run方法,此方法是传入函数的方法执行run
    print('主进程', os.getpid())
主进程 11564
子进程: 17852 11564
  • 现在我要给子进程传参数,在第一种开启进程的方法中是用args传,现在是要通过面向对象传
from multiprocessing import Process
import os
class MyProcess(Process):
    def __init__(self, *args):   # 在MyProcess()括号中传的参数一定是init接收了,所以必须重写__init__ 方法,
        super().__init__() # 执行父类的init  # 由于父类已经有init方法,而且这些init里面的内容在开启进程中肯定会用的。所以要几次父类中init方法。
        self.args = args

    def run(self):
        print(self.args)  # 打印传的参数
if __name__ == '__main__':
    p = MyProcess('参数', '参数2', '参数3', '参数4')
    p.start()

运行结果

('参数', '参数2', '参数3', '参数4')

注意:在多个进程之间是一种资源抢占关系。不仅抢占了cpu资源,还抢占了文件,屏幕等资源。当两个资源都争先恐后地往一个文件里面写的时候。会出现光标等有问题。但是数据不会丢。

例2:

from multiprocessing import Process
import time
class MyProcess(Process):
    def run(self):
        time.sleep(1)
        print('hello', self.name, time.ctime())

if __name__ == '__main__':
    p_list = []
    for i in range(3):
        p = MyProcess()
        p.daemon = True    # 线程中:t.setDaemon(True)  ,进程中守护进程为属性,线程中为方法   
        p.start()
        p_list.append(p)

    for p in p_list:
        p.join()
    print('end')

运行结果:

hello MyProcess-1 Sat Sep 22 16:25:43 2018
hello MyProcess-2 Sat Sep 22 16:25:43 2018
hello MyProcess-3 Sat Sep 22 16:25:43 2018
end

猜你喜欢

转载自blog.csdn.net/weixin_42233629/article/details/82975212