Python多进程的⾃定义共享数据类型
python新建项目教程最近项⽬要⽤到Python多进程,进程是1+N式的,1⽤来向⼀个数据结构中不断的写数据,其他N个进程从同时从这个数据结构中读数据,每条数据都是⼀次性的。因此:
当前进程可以作为这⾥的1进程,然后默认新建N个⼦进程。N的⼤⼩⼀般和CPU核数相同,如果是⽣产环境,不想让程序占满服务器的资源,可以再设置⼀个最⼤进程数。
因为是共享操作,这个数据结构就需要是进程安全的。
在⽹上查了⼀些关于Python多进程的资料,发现⼤多都只是从官⽅⽂档中随便了些代码(有的连改都没改),都是些不能⽤来实⽤的初级知识,实在⽆法称其为教程(这⾥⾯就包括我之前写的Python多进程⽂章)。经过我不断的筛选和阅读官⽅⽂档,终于让我到了⼀个可以⽤的⽅法。
这⾥先列出我到的对我有帮助的⽂章列表:
multiprocessing
python进程间共享数据
Python multiprocessing.Manager介绍和实例(进程间共享数据)
Python之路 - 多进程实例及回调函数
正式写代码之前,先要说清楚⼏个点。
理解多进程
这点可以参考下我之前写的⽂章线程、进程、协程。对于⼀个进程来说,如果其调⽤了join(),它会阻塞⾃⼰,⼀直要等到其他进程都退出后才会继续执⾏下去。
这就解决了我的第⼀个问题,就是让主进程作为1进程不断写⼊数据,具体的操作⽅法就是在新建⼦进程时不调⽤其join()⽅法。
由浅⼊深的⼏个例⼦
multiprocessing库提供了两种⽅式建⽴⼦进程Process类和Pool类,前者需要对每个⼦进程进⾏操作,包括通信、同步和共享;后者则是对前者的封装,其维护了⼀定的进程池并实现了异步操作。当然还有⼀些其他的操作,这⾥就不赘述了。
场景
我这⾥需要的共享数据结构是⼀个最⼩堆,堆中的存储的是⼀条条记录(⼤概30W条),并按照某个记录中的时间戳排序。1进程会定时刷新这个堆,N进程会不断从堆中pop数据,处理后根据新的时间戳再push进堆中。
这其中其实涉及到了⼏个点:建⽴多进程、给⼦进程传⼊参数、⾃定义堆结构、共享锁。这⾥我⼀⼀解释。
建⽴⼦进程并传⼊参数的⽅式
前⾯说了,建⽴⼦进程⼀般来说有两种⽅式:Process和Pool,这⾥我⽤了Process。为什么不⽤Pool呢?Pool的优势是可以使⽤异步操作,但这⾥有个问题就是普通的multiprocess.Lock不⽀持Pool,需要使⽤Manager().Lock()才⾏,这样就显得笨重了,加上我这个项⽬对异步要求并不⾼,就采⽤了Process类⽤来创建⼦进程。
这部分代码⽹上搜⼀下有很多,我也放出我的测试代码:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论