分属不同文件的消费者生产者不把队列赋值给类的属性,并作为参数传入子进程无法进行通信

简单说

  • multiprocessingQueue放在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,会发生显示的数字均不相同,不同的队列是怎么进行通信的呢?
谢谢。

阅读 1.5k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题