关于python的多进程的一些细节

不同平台的区别

在 windows平台,python是使用spawn方式创建子进程,即导入当前的脚本作为module运行。在linux平台,则是以fork的方式创建子进程,父进程会拷贝当前的进程信息给子进程,子进程和父进程在异步继续执行。

这两种方式的不同,会导致我们在写代码时需要注意一些细节,对于spawn方式,由于子进程是重新导入一份脚本,所以创建子进程之前的代码也有可能被子进程执行,导致子进程又创建子进程,会出错。我们需要加入if name == 'main’来规避这种意外,即将只希望主进程执行的代码放在条件判断后,因为是导入模块,子进程并不会执行条件判断后的代码。而fork方式则不会产生这种情况,子进程会继续沿着主进程的进度往下执行。

使用multiprocessing创建多进程

在python中提供了multiprocessing类来创建多进程,可以一个一个地创建,即使用mp.Process(func,args),也可以使用进程池,mp.Pool来创建进程,调用pool的apply_async方法,这是异步创建,多个子进程会并发,而不是像apply的串行阻塞,在进程池加入任务后,利用close方法关闭进程池,再调用join方法阻塞主进程。
考虑到第一点,在Linux下,multiprocessing是默认fork方式,而我们可以使用mp.set_start_method(‘spawn’)来更改创建方式,两者不同如下面简单示例所示:
第一种情况,默认fork:
在这里插入图片描述
在这里插入图片描述

第二种情况,改为spawn:
在这里插入图片描述
在这里插入图片描述
可以看出,spawn方式下的子进程会再次执行main判断之外的可执行代码,这点要注意,尤其是windows系统。

使用multiprocessing多进程共享数据

由于不像多线程,数据是共享的,对于多进程,在创建子进程时,主进程会拷贝一份进程资源给子进程,这就造成了数据之间的独立,给我们维护一个多进程共享的数据库造成了麻烦。不过Mulprocessing库引入了一些共享的数据类型,我们可以使用,比如manager,manager可以包含很多数据类型,比如list,dict等。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python多进程可以通过使用`multiprocessing`模块来实现。这个模块提供了创建和管理进程的功能。 要使用多进程,你需要先导入`multiprocessing`模块,然后创建一个`Process`对象来表示一个进程。你可以使用`Process`类的构造函数来指定要执行的函数和参数。 下面是一个简单的示例,展示了如何使用多进程来并行执行任务: ```python import multiprocessing def worker(num): """进程要执行的任务""" print(f'Worker {num} started') # 执行任务... print(f'Worker {num} finished') if __name__ == "__main__": # 创建两个进程 p1 = multiprocessing.Process(target=worker, args=(1,)) p2 = multiprocessing.Process(target=worker, args=(2,)) # 启动进程 p1.start() p2.start() # 等待进程结束 p1.join() p2.join() print("All processes finished") ``` 在上面的示例中,我们定义了一个`worker`函数来表示每个进程要执行的任务。然后,我们创建了两个进程,每个进程都调用`worker`函数,并传入不同的参数。最后,我们启动这两个进程,并使用`join`方法等待它们执行完毕。 注意到我们在代码的顶部使用了`if __name__ == "__main__":`这个条件判断语句。这是为了确保在主程序中执行代码时才会创建新的进程,避免在子进程中再次创建子进程导致无限递归。 这只是多进程的一个简单示例,`multiprocessing`模块还提供了更多功能,如进程间的通信和数据共享。你可以查阅相关文档来了解更多细节

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值