python多进程与进程间通信:fork()方法和multiprocess实例

本文介绍了Python在多核CPU环境下如何利用多进程提高处理速度,详细讲解了fork()方法(仅限于Linux/Unix/MacOS)、跨平台的multiprocessing模块、进程池Pool的使用,以及进程间通信的实现,包括Queue、pipe()和Manager。通过实例展示了如何在不同进程间交换数据,强调了在Windows系统中需注意的pickle序列化问题,并给出了使用Manager进行并行计算的示例。

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

目录

fork()方法(windows不可用)

跨平台multiprocessing

进程池Pool

进程间通信

Queue

pipe()

Manager

注意事项

参考资料


考虑到现在电脑一般都有双核甚至四核的CPU,故可设计算法并行的方法,通过python编程实现并行运算,从而加快处理的速度。虽然没有GPU进行图像算法的并行运算,但是能利用好双核CPU应该也是大有帮助吧!

fork()方法(windows不可用)

对于Linux/Unix/MacOS系统,可以用fork()方法创建子进程。如果你是这些系统,或macbook电脑,就学习fork()方法即可。

由于没有实践过,这部分可参考廖雪峰老师网站,但是网上的资料都比较简练,需要深入了解实践的话还需要多研究一下。

由于Windows没有fork调用,上面的代码在Windows上无法运行。由于Mac系统是基于BSD(Unix的一种)内核,所以,在Mac下运行是没有问题的。有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,在上述例子里,先fork()好了子进程,遇到if...else...语句后,父进程处理了第一个语句(if),打印相应内容;接着else:则由子进程来处理。(常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。)

关于fork()方法,需要注意的几个关键点:

1、子进程与父进程的复制关系:

子进程拥有父进程的所有内存的精确副本。当使用fork给进程分叉时,它会创建一个自己的副本。在多线程环境中,fork意味着执行的线程是重复的,但是可以分开。因此,有的学者认为fork很像生物里克隆的概念。子进程克隆了父进程。获取了父进程的数据和代码。

子进程退出必须使用os.exit(0),否则子进程将返回到父进程中。

2、相互独立关系

父进程和子进程的执行是相互独立的。fork操作为子进程创建了一个单独的地址空间。子进程从操作系统接收一个新的进程号PID号(PID,进程标识符)。

3、fork()的返回值:

fork的返回值决定当前正在进行的是哪一个进程:0表示在子进程中,正值表示在父进程中,-1表示出错了。 

跨平台multiprocessing

虽然windows不支持fork方法,但是鉴于python的跨平台特性,windows也是有办法的——multiprocessing模块就是跨平台版本的多进程模块。

multiprocessing模块提供了一个Process来代表一个进程对象。

下面的例子演示了启动一个子进程并等待其结束:


                

实战派 ESP32-S3,双模无线开发板

ESP32-S3 原生支持 ESP-IDF,WiFi + 蓝牙一次搞定

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值