Process
之間肯定是需要通信的,操作系統提供了很多機制來實現進程間的通信。Python的multiprocessing
模塊包裝了底層的機制,提供了Queue
、Pipes
等多種方式來交換數據。
一、我們以Queue
為例,在父進程中創建兩個子進程,一個往Queue
里寫數據,一個從Queue
里讀數據:
from multiprocessing import Process,Queue
import os,time,random
# 寫數據進程執行的代碼:
def write(q):print("Process to write: %s"% os.getgid())for value in ['A','B','C']:print('Put %s to queue...' % value)q.put(value)time.sleep(random.random())#讀數據進程執行的代碼
def read(q):print("Process to read: %s "% os.getgid())while True:value = q.get(True)print('Get %s from queue.' % value)if __name__ == '__main__':# 父進程創建Queue,并傳給各個子進程q = Queue()pw = Process(target=write, args=(q,))pr = Process(target=read, args=(q,))#啟動子進程pw,寫入:pw.start()#啟動子進程pr,讀取:pr.start()#等待pw結束pw.join()#pr進程這里是死循環,無法等待其結束,只能強行終止pr.terminate()
輸出:
Process to write: 15582
Put A to queue...
Process to read: 15583?
Get A from queue.
Put B to queue...
Get B from queue.
Put C to queue...
Get C from queue.
在Unix/Linux下,multiprocessing
模塊封裝了fork()
調用,使我們不需要關注fork()
的細節。由于Windows沒有fork
調用,因此,multiprocessing
需要“模擬”出fork
的效果,父進程所有Python對象都必須通過pickle序列化再傳到子進程去,所有,如果multiprocessing
在Windows下調用失敗了,要先考慮是不是pickle失敗了。
二、管道Pipes
現有2個進程A和B,他們都在內存中開辟了空間,那么我們在內存中再開辟一個空間C,作用是連接這兩個進程的。對于進程來說內存空間是可以共享的(任何一個進程都可以使用內存,內存當中的空間是用地址來標記的,我們通過查找某一個地址就能找到這個內存)A進程可以不斷的向C空間輸送東西,B進程可以不斷的從C空間讀取東西,這就是進程間的通信???
??????這個通信方式的原理類似于用文件通信,一個進程往文件里寫,另外一個進程從文件里讀取,最大的不同在于管道里C的空間是開辟在內存當中,第一是他不容易被截獲,第二是進程結束后內存空間他會自動的釋放掉,文件就不能自動釋放掉。第三就是內存的傳輸是不需要和磁盤交互,所以相比文件管道的傳輸效率要高很多,這就是管道的基本原理。
??????管道在信息傳輸上是以流的方式傳輸, 也就是你從A進程不斷的寫入,B進程源源不斷的讀出,A進程先寫入的就會被B進程先讀出,后寫進來的就會被后讀出,管道不僅僅可以讓A進程寫C內存空間收,也可以B進程寫,C內存空間收,也就是雙向通信,單項通信叫做半雙工,雙向叫做全雙工。
2.管道本質
?????在內存中開辟一個新的空間,對多個進程可見,在通信形式上形成一種約束
3.創建管道
?????multiprocessing------------->Pipe
?????1.首先理解Pipe是什么,有人理解為類,那到底是什么?
????????>>> from multiprocessing import Pipe
????????>>> type(Pipe)
????????????????<class 'method'>
???????可以看到是個方法,也就是函數,是通過函數的返回值來完成工作的,不是類
?
----------------------
待完善
?
參考:
(1)、https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/001431927781401bb47ccf187b24c3b955157bb12c5882d000
(2)、https://blog.csdn.net/weixin_39859512/article/details/80898340
?
?