自定义一个类,继承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