在Python中构建阻塞的零长度队列的好方法

2024-05-12 18:23:19 发布

您现在位置:Python中文网/ 问答频道 /正文

在Java中,有java.util.concurrent.SynchronousQueue,一个没有存储容量的队列。尝试放置/获取值的线程总是阻塞,直到另一个线程分别尝试获取/放置值为止。在

在Python中有什么好方法可以实现同样的效果?一、 我想要一种方法来将值从一个或多个线程集传递到另一个一个或多个线程集,而不必“属于”任何一个组中的线程。在

Python的queue.Queue不允许长度为0,为最大容量指定一个非正值将创建一个无界队列。在


Tags: 方法队列queueutiljava线程concurrent存储容量
2条回答

我有种感觉下面可能是死锁之城,但是下面的工作会怎么样?在

class SynchronousQueue(object):
    def __init__(self):
        self.ready_to_get = Queue(1)
        self.queue = Queue(1)

    def get(self):
        self.ready_to_get.put('ready', block=True)
        return self.queue.get(block=True)

    def put(self, item):
        self.ready_to_get.get(block=True)
        self.queue.put(item, block=True)

一个常规队列支持您想要的一半(getter等待putter),因此我们可以尝试通过阻塞put来实现相反的效果,直到get启动。在

您可以使用Queue.join()Queue.task_done()来阻止,直到get()完成:

class SynchronousQueue(object):

    def __init__(self):
        self.q = Queue(1)
        self.put_lock = RLock()

    def get(self):
        value = self.q.get(block=True)
        self.q.task_done()
        return value

    def put(self, item):
        with self.put_lock:
            self.q.put(item, block=True)
            self.q.join()

相关问题 更多 >