参考文档 https://docs.python.org/3/library/multiprocessing.html 。 官方文档上的解释: spawn:(mac&windows) 父进程启动一个新的 python 解释器进程。子进程将仅继承运行进程对象run()方法所需的那些资源。特别是,不会继承父进程中不必要的文件描述符和句柄。与使用fork或forkserver相比,使用此方法启动进程相当慢。 在 Unix 和 Windows 上可用。Windows 和 macOS 上的默认设置。
fork:(linux) 父进程用于os.fork()派生 Python 解释器。子进程在开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全地分叉多线程进程是有问题的。
个人感觉前者和后者的区别是后者子进程像是在创建的时候走了一个新的分叉,而后者则是相当于从头导入了原来的脚本,然后执行目标方法。所以一个叫fork(分叉,叉子),因为它不是从头开始,而另一个叫spawn产卵,从头开始。
如下列代码
import multiprocessing
import time
start_time = time.time()
print('生成全局变量 start_time', start_time)
def record_thread():
print(start_time)
def main():
for i in range(5):
p = multiprocessing.Process(target=record_thread, args=())
p.start()
time.sleep(1)
if __name__ == '__main__':
main()
mac 打印结果: 生成全局变量 start_time 1646189696.7611232 生成全局变量 start_time 1646189697.003395 1646189697.003395 生成全局变量 start_time 1646189698.023154 1646189698.023154 生成全局变量 start_time 1646189699.0617259 1646189699.0617259 生成全局变量 start_time 1646189700.0642502 1646189700.0642502 生成全局变量 start_time 1646189701.1011882 1646189701.1011882
而linux打印结果却是: 生成全局变量 start_time 1646189683.671951 1646189683.671951 1646189683.671951 1646189683.671951 1646189683.671951 1646189683.671951
所以,multiprocessing多进程在linux的表现更像是我们理解的多线程,而在mac和windows上就有点像是多进程执行整个脚本
|