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

发布于 2022-09-06 01:52:24 字数 3082 浏览 13 评论 0

简单说

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文