通过Process类创建进程
multiprocessing模块提供的Process类可通过两种方式创建子进程:一种是直接通过Process类创建子进程,另一种方式是通过Process子类创建子进程。下面分别绍这两种方式。
1. 通过Process类创建子进程
创建Process对象需要使用Process类的构造方法Process(),该方法的声明如下:
Process(group=None, target=None, name=None, args=(), kwargs={}, *, daemon=None)
Process()方法中常用参数的含义如下:
group,必须为None,目前未实现,是为以后的扩展功能保留的预留参数。
target,表示子进程的功能函数,用于为子进程分派任务。
name,表示当前进程的名称。若没有指定,默认为Process-N,N为从1开始递增的整数。
args,target指定函数的位置参数。
kwargs,传入target指定函数的关键字参数。
daemon,表示是否将进程设为守护进程(在后台运行的一类特殊进程,用于执行特定的系统任务)。
创建一个Process对象,指定它要执行的任务函数do_task(),示例代码如下:
from multiprocessing import Process
import os
def do_task():
print('子进程运行:%s' % os.getpid())
process = Process(target=do_task)
2. 通过Process子类创建子进程
自定义一个继承自Process类的子类,调用子类的构造方法亦可创建子进程。例如,自定义一个Process的子类MyProcess,具体代码如下:
from multiprocessing import Process
import time
import os
class MyProcess(Process):
def __init__(self, interval):
Process.__init__(self) # 完成父类的初始化
self.interval = interval # 间隔秒数
def run(self): # 重写Process类run()方法
time_start = time.time() # 返回开始时间的时间戳
time.sleep(self.interval)
time_stop = time.time() # 返回结束时间的时间戳
print("子进程%s执行结束,耗时%0.2f秒" % (os.getpid(), time_stop - time_start))
以上代码定义的Process子类MyProcess中重写了init()和run()方法,其中init()方法定义了表示间隔秒数的属性interval;run()方法实现计算且输出子进程从执行到结束的时长的功能。如果创建子进程时未设置target参数,那么在进程启动之后自动调用run()方法。
使用MyProcess的构造方法创建一个子进程,代码如下。
my_process = MyProcess(5)
进程在创建完之后,需要通过start()方法启动。例如,启动刚刚创建的子进程my_process,代码如下:
if __name__ == '__main__':
my_process = MyProcess(5) # 使用自定义类创建子进程
my_process.start() # 启动进程
程序执行的结果如下所示:
子进程896执行结束,耗时5.00秒
需要注意的是,Windows系统中使用multiprocessing模块时,必须采用“if __ name__ ==’__ main__’”的方式运行程序。