Python Windows系统多进程创建模式及简单应用
`
Python 多进程不受GIL锁的限制,多进程之间可以并行执行。
多进程应用需要调用python标准模块Multiprocessing
通过调用os.getpdi()方法可以查看当前进程的编号
下面示例可以展示多进程的简单创建及传入参数
import multiprocessing
import time
import os
# 子进程的代码
def run_proc(name, sec):
for _index in range(sec):
print('{} Process id: {} running seconds: {}'.format(name, os.getpid(), _index))
time.sleep(1)
if __name__ == '__main__':
multiprocessing.set_start_method('spawn')
# windows 系统不支持fork模式,如果使用会报错
# multiprocessing.set_start_method('fork')
print('Parent process %s.' % os.getpid()) # 打印当前进程 pid
# 实例化一个进程,注意传入的参数为一个元组,当只有一个参数时,写成(arg,)
p1 = multiprocessing.Process(target=run_proc, args=('Child 1', 5))
p2 = multiprocessing.Process(target=run_proc, args=('Child 2', 20), daemon=True)
print('Child process will start.')
p1.start()
p2.start()
run_proc("Parent", 5)
p1.join() # join()方法可以等待子进程结束后再继续往下运行,通常用于进程间的同步。
print('Child1 exit code {}'.format(p1.exitcode))
# p2.join() # 设置p2的进程阻塞,如果不设置则主线程会执行完直接退出,但P2因未执行完而导致报错
print('Child process end.')
print('Child1 exit code {}'.format(p1.exitcode))
print('Child2 exit code {}'.format(p2.exitcode))
输出如果:
Parent process 19020.
Child process will start.
Parent Process id: 19020 running seconds: 0
Child 1 Process id: 17752 running seconds: 0
Child 2 Process id: 17344 running seconds: 0
Parent Process id: 19020 running seconds: 1
Child 1 Process id: 17752 running seconds: 1
Child 2 Process id: 17344 running seconds: 1
Parent Process id: 19020 running seconds: 2
Child 2 Process id: 17344 running seconds: 2
Child 1 Process id: 17752 running seconds: 2
Parent Process id: 19020 running seconds: 3
Child 2 Process id: 17344 running seconds: 3
Child 1 Process id: 17752 running seconds: 3
Parent Process id: 19020 running seconds: 4
Child 2 Process id: 17344 running seconds: 4
Child 1 Process id: 17752 running seconds: 4
Child 2 Process id: 17344 running seconds: 5
Child1 exit code 0
Child process end.
Child1 exit code 0
Child2 exit code None
Process finished with exit code 0
总结
1、注意创建多任务模式在windows系统中只能是spawn模式,也即创建的子进程仅获得主进程必要的资源,但如果主进程退出了子进程可能会报错。
2、如p2进程如果没有p2.join()则主进程直接退出后程序会报错。