亭午 2023-02-27 14:16 采纳率: 0%
浏览 17

学习python queue中遇到问题


from multiprocessing import Process, Lock, Semaphore, Queue
import time
from random import random

buffer = Queue(10)
empty = Semaphore(2)   # 信号量
full = Semaphore(0)
lock = Lock()


class Consumer(Process):   # 继承Process
    # 消费者消费full中的产品
    def run(self):
        global buffer, empty, full, lock
        while True:
            # acquire方法 消耗资源加1
            # release方法 释放资源加1
            full.acquire()
            lock.acquire()
            print("Consumer get ", buffer.get())
            time.sleep(1)
            lock.release()
            empty.release()


class Producer(Process):   # 继承Process
    # 生产者往full中生产
    def run(self):
        global buffer, empty, full, lock
        while True:
            empty.acquire()
            lock.acquire()
            num = random()
            buffer.put(num)
            print("Producer put ", num)
            time.sleep(1)
            lock.release()
            full.release()


if __name__ == "__main__":
    p = Producer()
    c = Consumer()
    p.daemon = True
    c.daemon = True   # 当父进程结束后,子进程自动终止
    p.start()
    c.start()
    p.join()    # 子进程调用join()方法 父进程等待子进程执行完毕
    c.join()
    print("Ended!")

img

不知道为什么Consumer类运行不出来

  • 写回答

2条回答 默认 最新

  • CodeBytes 2023-02-27 14:18
    关注

    该回答引用ChatGPT

    可以在获取缓冲区元素之前先打印输出语句。这样,当进程阻塞在buffer.get()时,你仍然能够看到输出语句。

    具体来说,你可以将print("Consumer get ", buffer.get())语句移动到lock.acquire()语句的前面,像这样:

    
    class Consumer(Process):
        def run(self):
            global buffer, empty, full, lock
            while True:
                full.acquire()
                lock.acquire()
                print("Consumer waiting...")
                print("Consumer get ", buffer.get())
                time.sleep(1)
                lock.release()
    
    
            empty.release()
    

    这样,即使buffer.get()调用阻塞了进程,你也能够看到消费者等待的输出语句。

    评论

报告相同问题?

问题事件

  • 创建了问题 2月27日