分属不同文件的消费者生产者不把队列赋值给类的属性,并作为参数传入子进程无法进行通信
简单说
multiprocessing
的Queue
放在myqueue.py
中- 分属两个文件生产者消费者分别导入
myqueue.queue
,以此进行通信
但是问题是,如果不把myqueue.queue
设为生产者或消费者的属性之一,则无法完成通信,生产者在队列满时阻塞,但是消费者却一直在get
的时候阻塞
下面是代码
首先是队列,myqueue
文件内容
#myqueue.py
# -*- coding: utf-8 -*-
from multiprocessing import Queue
queue = Queue(5)
消费者文件内容
# -*- coding: utf-8 -*-
from multiprocessing import Process
from myqueue import queue
import time
class Reader:
def __init__(self):
self.q = queue
def reader1(self, queue):
print ('read1Queue ', id(queue))
while queue.qsize != 0:
num = queue.get()
print ('reader1: ', num)
time.sleep(1)
def reader2(self, queue):
print ('read2Queue', id(queue))
while queue.qsize != 0:
num = queue.get()
print ('reader2: ', num)
time.sleep(1)
def Start(self):
print ('readStartQueue ', id(queue))
print ('self.q ', id(self.q))
#如果此处不传入self.q,传入queue,则无法完成通信
r1 = Process(target = self.reader1, args = (self.q, ))
r2 = Process(target = self.reader2, args = (self.q, ))
r1.start()
r2.start()
r1.join()
r2.join()
if __name__ == "__main__":
dl = Reader()
dl.Start()
生产者文件内容
# -*- coding: utf-8 -*-
from multiprocessing import Process
from myqueue import queue
import random
class Writer:
def __init__(self):
self.q = queue
def writer1(self, queue):
print ('write1Queue ', id(queue))
for n in range(10):
num = random.randint(0, 30)
queue.put(num)
print ('writer1: ', num)
def writer2(self, queue):
print ('write2Queue ', id(queue))
for n in range(10):
num = random.randint(0, 30)
queue.put(num)
print ('writer2: ', num)
def Start(self):
print ('writeQueue ', id(queue))
print ('self.WriteQueue', id(self.q))
#此处同消费者
w1 = Process(target = self.writer1, args = (self.q, ))
w2 = Process(target = self.writer2, args = (self.q, ))
w1.start()
w2.start()
w1.join()
w2.join()
在文件main.py
中启动消费者生产者
# -*- coding: utf-8 -*-
from multiprocessing import Process
from writer import Writer
from reader import Reader
class Main:
def __init__(self):
self.write = Writer()
self.read = Reader()
def Start(self):
w = Process(target = self.write.Start)
r = Process(target = self.read.Start)
print ('start')
w.start()
r.start()
w.join()
r.join()
if __name__ == "__main__":
main = Main()
main.Start()
此外还有一个文件,通过查看不同地方的队列的id
,会发生显示的数字均不相同,不同的队列是怎么进行通信的呢?
谢谢。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论