Python中的多进程可以使用到多颗CPU带来的好处,在前面多线程中已经总结出,对于IO密集型的操作,由于IO不占用CPU,所以使用轻量级的多线程即可解决问题;而对于计算密集型操作,由于多线程不支持使用多颗CPU,所以使用多进程是最合适的。本篇文件就介绍Python多进程的使用
创建一个子进程 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 import multiprocessingimport timedef worker (arg) : time.sleep(2 ) print(arg) if __name__ == '__main__' : p = multiprocessing.Process(target=worker, args=("Hello PolarSnow" ,)) p.start() print("p.pid:" , p.pid) print("p.name" , p.name) print("p.is_alive:" , p.is_alive()) ------------ p.pid: 17731 p.name Process-1 p.is_alive: True Hello PolarSnow
如果你看过前面多线程的文章,可以看出,多进程的基本用法和多线程很相似
多个进程处理同一个函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 import multiprocessingimport timedef worker (arg) : time.sleep(2 ) print(arg) if __name__ == '__main__' : for i in range(5 ): p = multiprocessing.Process(target=worker, args=(i,)) p.start() print("CPU数量:" , str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("子进程名称:" , p.name, "子进程id:" , p.pid) ------------ CPU数量: 4 子进程名称: Process-5 子进程id: 18705 子进程名称: Process-3 子进程id: 18703 子进程名称: Process-2 子进程id: 18702 子进程名称: Process-1 子进程id: 18701 子进程名称: Process-4 子进程id: 18704 0 1 2 3 4
多个进程处理多个函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 import multiprocessingimport timedef worker1 (arg) : time.sleep(2 ) print("worker1" , arg) def worker2 (arg) : time.sleep(2 ) print("worker2" , arg) def worker3 (arg) : time.sleep(2 ) print("worker3" , arg) if __name__ == '__main__' : p1 = multiprocessing.Process(target=worker1, args=("PS1" ,)) p2 = multiprocessing.Process(target=worker1, args=("PS2" ,)) p3 = multiprocessing.Process(target=worker1, args=("PS3" ,)) p1.start() p2.start() p3.start() print("CPU数量:" , str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("子进程名称:" , p.name, "子进程id:" , p.pid)
daemon属性 不加daemon属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import multiprocessingimport timedef worker (arg) : time.sleep(2 ) print(arg) if __name__ == '__main__' : for i in range(5 ): p = multiprocessing.Process(target=worker, args=(i,)) p.start() print("CPU数量:" , str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("子进程名称:" , p.name, "子进程id:" , p.pid) print("End" ) ------------ CPU数量: 4 子进程名称: Process-2 子进程id: 21859 子进程名称: Process-3 子进程id: 21860 子进程名称: Process-1 子进程id: 21858 子进程名称: Process-4 子进程id: 21861 子进程名称: Process-5 子进程id: 21862 End 0 1 2 3 4
加上daemon属性
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 import multiprocessingimport timedef worker (arg) : time.sleep(2 ) print(arg) if __name__ == '__main__' : for i in range(5 ): p = multiprocessing.Process(target=worker, args=(i,)) p.daemon = True p.start() print("CPU数量:" , str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("子进程名称:" , p.name, "子进程id:" , p.pid) print("End" ) ------------ CPU数量: 4 子进程名称: Process-2 子进程id: 21913 子进程名称: Process-1 子进程id: 21912 子进程名称: Process-4 子进程id: 21915 子进程名称: Process-5 子进程id: 21916 子进程名称: Process-3 子进程id: 21914 End
p.daemon
的默认值为False
,意为主进程等待子进程执行完毕后再退出程序
p.daemon
的值为True
时,意为当主进程执行完毕时,立即退出程序
join方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 import multiprocessingimport timedef worker (arg) : time.sleep(2 ) print(arg) if __name__ == '__main__' : for i in range(5 ): p = multiprocessing.Process(target=worker, args=(i,)) p.daemon = True p.start() print("CPU数量:" , str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("子进程名称:" , p.name, "子进程id:" , p.pid) p.join() print("End" ) ------------ CPU数量: 4 子进程名称: Process-2 子进程id: 22196 子进程名称: Process-1 子进程id: 22195 子进程名称: Process-3 子进程id: 22197 子进程名称: Process-5 子进程id: 22199 子进程名称: Process-4 子进程id: 22198 0 1 2 3 End
注意:
join方法的作用是阻塞住主进程,让CPU无法执行join后面的代码,专注执行多线程
上面演示的是多个进程对应一个join的情况,意为等待所有的子进程执行完毕后,再向下执行代码;如果join写在for循环里面,多个线程对应多个join时,意为前一个子进程执行完毕后,才能执行下一次循环,执行下一个任务
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 import multiprocessingimport timedef worker (arg) : time.sleep(2 ) print(arg) if __name__ == '__main__' : for i in range(5 ): p = multiprocessing.Process(target=worker, args=(i,)) p.daemon = True p.start() p.join() print("CPU数量:" , str(multiprocessing.cpu_count())) for p in multiprocessing.active_children(): print("子进程名称:" , p.name, "子进程id:" , p.pid) print("End" )
相当于用子进程串行执行任务
join是可以添加参数的,在没有参数的时候,会一直阻塞到函数执行完毕为止;设置参数后(int 时间 单位是秒)意为join最长阻塞的时间,超过这个时间后,不管子进程有没有执行完毕都会继续向下执行
最多等待1秒(最多阻塞1秒)