IPC指的是进程间通信。在python的多进程编程中,虽然一般情况下,最好保持进程之间的独立性,避免引发一些预期之外的bug,但是有时难免需要在进程之间进行交流、同步。在python的进程间通信中,一般有两种主要的方式:一是共享内存;二是利用一个新的服务器进程作为进程间的桥梁,实现进程间的通信。
对于共享内存,其基本的原理是通过在内核中开辟一块内存,这块内存保存着进程之间共享的变量,进程之间通过共享这些变量的状态以实现交流和通信。在实现上,一般每个进程会有一个共享内存中变量的映射,这个映射也是一个对象,其中封装好了指向共享内存中相应变量的指针,并会实时的同步共享内存中变量的状态。要注意的是,这种同步在映射和共享内存中的变量之间是双向的,一般的,在python中,会有特定的数据结构实现这种机制,比如Value,Array,而且其是进程安全的。由于每个进程内具有自己的映射对象,所以当我们调用共享内存中变量的时候,实际上是在调用自己进程内存中的映射对象,所以当我们在每个进程中获取共享对象的内存地址时,其地址是不一样的。
对于服务器进程,其是通过新建一个进程,作为进程间的桥梁,通过在这个新建进程中创建共享变量,同样的,每个子进程也有自己的关于共享变量的映射,其逻辑和共享内存时一样的,只是这里共享内存变成了一个服务器进程,比如Manager。要注意的是,关于Manager,其可以实时的监控到服务器进程中不可变变量的变化,即可以自动同步进程间不可变变量,但是对于可变变量,比如字典和列表,其无法直接监测到,所以为了同步列表等可变对象,需要利用Manager自有的list对象,而不能用python内置的list对象。