- 对于进程我们熟知其通信的方式有如下几种:
管道/匿名管道(pipe)
有名管道(FIFO)
信号(Signal)
消息(Message)队列
共享内存(share memory)
信号量(semaphore)
最近在写多进程运行的时候,发现python在多进程使用消息队列时,有一件有趣的事情,具体代码如下:
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()
在上面的代码中,用一个进程向队列中放数据,另一个队列从队列中取东西,结果发现只有放数据的进程在运行,去数据的程序中队列依旧是空的。对此,很好奇,后来我们通过打印队列的id的方式,查看是否属于同意队列,结果队列的id也是一样的。所以,经过仔细研究之后发现,当通过两个进程调用同一个类的方法,而类使用全局变量这样的前提下,两个进程分别复制了同一个队列,最后才出现这种情况。
解决办法是,使用多线程,或者在主进程中创建队列实例,作为类初始化的参数,给类的属性赋值也可