在Python中多进程的使用和多线程类似,也是先创建进程对象、再启动进程、最后阻塞进程,只是使用的包不一样,多进程使用multiprocessing包。本节就来聊聊Python的多进程。
P 1、进程启动方式
根据平台不同,multiprocessing包支持三种启动进程的方法,分别为spawn、fork、forkserver。
其中,spawn方法的父进程会启动一个新的 Python 解释器进程(默认在 Windows 和 macOS 上使用),子进程自能继承父进程较少资源。fork方法的父进程使用os.fork()来产生Python解释器分叉,即子进程可以继承父进程所有资源。forkserver方法和fork方法类似,但它启动时会产生一个服务器进程,后续进程都有该服务器进程分叉产生。使用哪种方法,可以用multiprocessing.set_start_method() 设置。
P 2、多进程语法结构
下面是多进程的语法结构:
和多线程一样,它也有deamon属性,用于创建守护进程。本文主要是演示进程使用,所以不关注该问题,有兴趣的小伙伴查阅Python手册。
案例展示,如下:
import timeimport multiprocessingdef myfunc(name): t0 = time.time() print(f' Process {name} : Start') time.sleep(2) print(f' Process {name} : End. Time={time.time()-t0}')if __name__=='__main__': # 和多线程的区别是,多进程必须有该语句开始 print('Process test : Start') t0 = time.time() proc = [] for i in range(3): # 创建进程 obj = multiprocessing.Process(target=myfunc,args=(i,)) proc.append(obj) for i in range(3): # 启动进程 proc[i].start() for i in range(3): # 等待进程结束,此时对进程的join()方法可以运行,但其余的代码不可执行。 proc[i].join() print(f'Process test : End.Time={time.time()-t0}')
运行效果,如下:
Process test : Start Process 0 : Start Process 1 : Start Process 2 : Start Process 0 : End. Time=2.000474452972412 Process 1 : End. Time=2.000626564025879 Process 2 : End. Time=2.000657320022583Process test : End.Time=2.2059056758880615
重点要说明的是,多进程的创建要求代码必须写在if __name__ == '__main__' :代码下,这是官方要求的。具体原因可以问问千问、混元等大模型兄弟们。-------------------------它是数字世界里的一把杀猪刀
却总能巧夺天工
它的世界是纯粹0、1组合
却总能创造无尽幻想
......
本公众号关注数据价值分析、编程学习,将不定期更新社会热点数据分析结果、编程技巧,分享数据分析工具、方法、学习等内容,欢迎有兴趣的小伙伴加入。