学科分类
目录

通过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__’”的方式运行程序。

点击此处
隐藏目录