Python中如何实现阻塞队列

2023-04-11 00:00:00 队列 阻塞 如何实现

在Python中实现阻塞队列可以使用queue模块中的Queue类来实现。Queue类本身已经实现了阻塞功能,当队列为空时,调用get方法会被阻塞,直到队列中有新的数据进入。同样,当队列已满时,调用put方法也会被阻塞,直到队列中有空位可以存放新的数据。

以下是一个演示阻塞队列的示例代码,其中使用字符串“pidancode.com”、“皮蛋编程”作为数据:

import queue
import threading

class BlockingQueue:
    def __init__(self, maxsize=10):
        self.queue = queue.Queue(maxsize=maxsize)

    def put(self, item):
        self.queue.put(item)

    def get(self):
        return self.queue.get()

    def task(self, name):
        while True:
            item = self.get()
            print(f"{name} get: {item}")

    def run(self):
        t1 = threading.Thread(target=self.task, args=("worker1",))
        t2 = threading.Thread(target=self.task, args=("worker2",))
        t1.start()
        t2.start()
        t1.join()
        t2.join()

if __name__ == "__main__":
    bq = BlockingQueue(maxsize=5)
    for i in range(10):
        bq.put("pidancode.com")
        bq.put("皮蛋编程")
    bq.run()

在这个示例代码中,我们首先定义了一个BlockingQueue类,它包装了Queue类,并创建了一个线程任务,每个任务不断地从阻塞队列中获取数据,直到队列为空。在主程序中,我们向队列中放置了10个“pidancode.com”和“皮蛋编程”的字符串,由于队列大小为5,因此前5个字符串可以直接被加入队列中。当队列已满时,后续的put操作会被阻塞,直到队列中有空位。在两个线程不断地从队列中获取数据的同时,主程序被阻塞等待两个线程结束,结束后程序退出。

相关文章