- 對于進(jìn)程我們熟知其通信的方式有如下幾種:
管道/匿名管道(pipe)
有名管道(FIFO)
信號(Signal)
消息(Message)隊列
共享內(nèi)存(share memory)
信號量(semaphore)
最近在寫多進(jìn)程運行的時候等龙,發(fā)現(xiàn)python在多進(jìn)程使用消息隊列時幼东,有一件有趣的事情溢豆,具體代碼如下:
import queue
import time
from multiprocessing import Process
COUNT = queue.Queue()
class A:
def put(self,num):
i = 0
while True:
print(id(COUNT))
COUNT.put(i,timeout=100)
print("放入",i)
i += num
if i >= 100:
break
def get(self):
while True:
print(id(COUNT))
num = COUNT.get(timeout=100)
time.sleep(4)
print("取出",num)
if __name__ == '__main__':
a = A()
p1 = Process(target=a.put,args=[2])
p2 = Process(target=a.get)
p1.start()
p1.join()
p2.start()
p2.join()
在上面的代碼中棍厂,用一個進(jìn)程向隊列中放數(shù)據(jù)慎菲,另一個隊列從隊列中取東西展运,結(jié)果發(fā)現(xiàn)只有放數(shù)據(jù)的進(jìn)程在運行顶别,去數(shù)據(jù)的程序中隊列依舊是空的些阅。對此狐粱,很好奇舀寓,后來我們通過打印隊列的id的方式,查看是否屬于同意隊列肌蜻,結(jié)果隊列的id也是一樣的互墓。所以,經(jīng)過仔細(xì)研究之后發(fā)現(xiàn)蒋搜,當(dāng)通過兩個進(jìn)程調(diào)用同一個類的方法篡撵,而類使用全局變量這樣的前提下判莉,兩個進(jìn)程分別復(fù)制了同一個隊列,最后才出現(xiàn)這種情況育谬。
解決辦法是券盅,使用多線程,或者在主進(jìn)程中創(chuàng)建隊列實例膛檀,作為類初始化的參數(shù)锰镀,給類的屬性賦值也可