python multiprocessing多进程在不同系统的执行差异

参考文档
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产卵,从头开始。

如下列代码

# -*- coding: utf-8 -*-
# @date    : 2022/3/2 10:48 上午
# @author  : meng_zhihao
# @email   : 312141830@qq.com
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=())  # target不能带括号!
        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上就有点像是多进程执行整个脚本

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值