各個進程的內(nèi)存都是獨立的镣奋,不能互相直接訪問,那我們?nèi)绾芜M行進程間通信呢悉尾?其實之前有提到過突那,就是通過一個中間人,來實現(xiàn)兩個進程之間的通信构眯,下面來看看都有哪些方式能夠?qū)崿F(xiàn)進程間通信
進程queue
說進程queue之前愕难,先說一下線程queue與進程的關(guān)系,因為這里有個事情要注意一下惫霸,首先看一段代碼
from multiprocessing import Process
import queue
# import os
def f():
q.put([3, None, 'dasda'])
print(q.get())
if __name__ == '__main__':
q = queue.Queue()
p = Process(target=f,)
p.start()
print(q.get(block=False))
可以看到這里用的隊列queue猫缭,主進程生成一個空隊列實例,然后再主進程再開一個進程壹店,在子進程里對隊列q進行操作饵骨,這段代碼在不同的環(huán)境中運行結(jié)果不同,在windows下當程序運行到f函數(shù)里的q.put([3, None, 'dasda'])
的時候就會拋出錯誤:q沒有定義茫打,這里也好理解,就是子進程無法訪問主進程的一些數(shù)據(jù)妖混,但是在mac老赤、ubuntu或者win下的anaconda下運行的時候子進程可以對q進程put和get操作,然后程序會在最后一行g(shù)et的時候拋出隊列為空的錯誤制市,這里我的理解方式就是子進程數(shù)據(jù)拷貝自父進程抬旺,也就是子進程存在一個定義了的q,但是進程間數(shù)據(jù)又不共享祥楣,所以主進程里的q還是為空
讓我們來看看這兩種情況
這個時候就用到了進程queue开财,使用進程queue來實現(xiàn)進程間的通信
from multiprocessing import Queue
from multiprocessing import Process
def run():
q.put(3)
# print(q.get())
if __name__ == '__main__':
q = Queue()
t = Process(target=run)
t.start()
# time.sleep(1)
print(q.get())
這里可能會問,既然進程也有queue误褪,那是不是這個queue能實現(xiàn)和線程queue一樣的效果呢责鳍?答案是no,線程queue實現(xiàn)的是操作同一份數(shù)據(jù)兽间,但是進程queue實現(xiàn)的是數(shù)據(jù)的復制历葛,通過復制一個queue來實現(xiàn)進程間通信
轉(zhuǎn)載請注明出處
python自學技術(shù)互助扣扣群:670402334