1. Python创建进程类Process
python的multiprocessing模块提供了一个创建进程的类Precess,其创建有以下两种方法:
- 创建Process类的实例,并指向目标函数和传递参数
- 自定义一个类并继承Process类,重写__init__()和run()方法
Process类的构造函数如下:
class multiprocessing.Process(group, target, name, kwargs)
def __init__(self,
group: Any = ...,
target: Optional[Callable] = ...,
name: Optional[str] = ...,
args: Iterable[Any] = ...,
kwargs: Mapping[Any, Any] = ...,
*,
daemon: Optional[bool] = ...) -> None: ...
参数说明:
target 表示调用对象,一般为任务函数,也可以为类;
args 给调用对象target传递的参数,为元组
kwargs 表示调用对象的字典
name 为进程的别名
group 参数不使用,可以忽略
Process类常用的方法和属性如下
方法
is_alive(): 返回进程是否激活
join([timeout]): 阻塞进程,直到进程执行完成或超时或进程被终止
run(): 代表进程执行任务的函数,可被重写
start(): 激活启动进程
terminate(): 终止进程
属性
authkey(): 字节码,进程的准秘钥
daemon(): 为True时,父进程终止后所有子进程自动终止,且不能产生新的进程,必须在start()方法前设置
exitcode:退出码,进程在运行时为None,如果为-N,就表示被信号N结束
name:获取进程名称
pid:进程id
1.1 我们首先使用第一种方法创建两个进程,并与单进程运行的时间做比较
from multiprocessing import Process
import time
def task_process(delay):
num = 0
for i in range(delay * 100000000): # 1亿次数据累加计算
num += i
if __name__ == '__main__':
t0 = time.time()
task_process(3)
task_process(3)
t1 = time.time()
print(f"单进程顺序执行耗时 {t1 - t0} ")
p0 = Process(target=task_process, args=(3,))
p1 = Process(target=task_process, args=(3,))
t2 = time.time()
p0.start()
p1.start()
p0.join()
p1.join()
t3 = time.time()
print(f"多进程并发执行耗时 {t3 - t2}")
输出结果:多进程执行相同的操作消耗的时间更少!
单进程顺序执行耗时 32.359516859054565
多进程并发执行耗时 17.804959535598755
1.2 使用第二种方法,自定义一个类并继承Process类
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, delay):
super().__init__()
self.delay = delay
# 子进程要执行的代码
def run(self):
num = 0
for i in range(self.delay * 100000000):
num += i
if __name__ == "__main__":
p0 = MyProcess(3)
p1 = MyProcess(3)
t0 = time.time()
p0.start()
p1.start()
p0.join()
p1.join()
t1 = time.time()
print(f"多进程并发执行耗时 {t1 - t0}")
输出结果
多进程并发执行耗时 16.68904447555542