学习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类运行不出来

该回答引用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()调用阻塞了进程,你也能够看到消费者等待的输出语句。