1. 多进程开发
- 进程是计算机中资源分配的最小单元;一个进程中可有多个线程,同一个进程中的线程共享资源;
- 进程与线程之间是相互隔离;
- Python中通过多进程可以利用CPU的多核优势,计算密集型操作使用与多进程;
1.1进程介绍
注意:进程的启动一定要写在if __name__ == "__mian__":
中
import multiprocessing
def task(args):
pass
if __name__ == "__main__":
p1 = multiprocessing.Process(target = task, args=('xxx',))
p1.start()
关于multiprocessing的三种创建模式(fork, spawn, forkserver)
- fork:适用于linux系统、mac系统(默认为spawn),可在任意位置启动进程,速度快,【子进程 拷贝 主进程 几乎所有资源】,【支持 文件对象/线程锁等传参】;
- spawn:适用linux系统、win系统、mac系统,只能在
if __name__ == "__mian__":
中启动,速度慢,【run参数传必备资源】,【不支持 文件对象/线程锁等传参】;
import multiprocessing
def task():
pass
if __name__ == "__main__":
# 在此处设置(win没必要设置,只能支持spawn)
multiprocessing.set_start_method("spawn")
p1 = multiprocessing.Process(target = task)
p1.start()
- forkserver:适用部分linux系统,只能在
if __name__ == "__mian__":
中启动(兼容性最差,几乎不使用);
因为大部分人使用的是win系统开发,所以这里只介绍spawn(主要还是因为qiong)
- 若你的开发环境为mac系统,使用fork,则无需手动向子进程传送参数,子进程已经获取到主进程的所有参数,并会给你自动分配;
- 若你和我一样qiong,则在创建子进程时,应该告知子进程你需要传入的参数;
注意:进程需等待cpu去执行(等待时间随机),cpu运行的其实是Process中的run方法;
import multiprocessing
import time
def task(data):
print(data)
data.append(123)
if __name__ == "__main__":
multiprocessing.set_start_method("spawn")
data = []
p1 = multiprocessing.Process(target = task, args = (data,))
p1.start()
time.sleep(1)
print(data)
1.2常见功能
进程的常见方法:
- p.start(),当前进程准备就绪,等待cpu调度(工作单元其实是进程的线程)
- p.join(),等待当前进程的任务执行完毕后再向下继续执行
import time
import multiprocessin