如何实现LIFO for multiprocessing.Queue在python中?

时间:2015-11-13 11:10:21

标签: python queue python-multiprocessing lifo

我理解队列和堆栈之间的区别。但是,如果我生成多个进程并在它们之间发送消息,请放入multiprocessing.Queue如何首先访问放入队列中的最新元素?

3 个答案:

答案 0 :(得分:1)

您可以使用multiprocessing manager打包queue.LifoQueue来执行您想要的操作。

from multiprocessing import Process
from multiprocessing.managers import BaseManager
from time import sleep
from queue import LifoQueue


def run(lifo):
    """Wait for three messages and print them out"""
    num_msgs = 0
    while num_msgs < 3:
        # get next message or wait until one is available
        s = lifo.get()
        print(s)
        num_msgs += 1


# create manager that knows how to create and manage LifoQueues
class MyManager(BaseManager):
    pass
MyManager.register('LifoQueue', LifoQueue)


if __name__ == "__main__":

    manager = MyManager()
    manager.start()
    lifo = manager.LifoQueue()
    lifo.put("first")
    lifo.put("second")

    # expected order is "second", "first", "third"
    p = Process(target=run, args=[lifo])
    p.start()

    # wait for lifoqueue to be emptied
    sleep(0.25)
    lifo.put("third")

    p.join()

答案 1 :(得分:0)

multiprocessing.Queue不是数据类型。它是两个进程之间进行通信的一种手段。它与Stack

无法比较

这就是为什么没有API来弹出队列中的最后一项。

我认为你的想法是让一些消息比其他消息具有更高的优先级。当它们被发送到侦听过程时,您希望尽快将它们出列,绕过队列中的现有消息。

您实际上可以通过创建两个multiprocessing.Queue来实现此效果:一个用于普通数据有效负载,另一个用于优先级消息。那你就不用担心getting the last item了。只需将两种不同类型的消息分成两个队列即可。

答案 2 :(得分:0)

如果你只关心最新的值或对象,设置 maxsize = 1

import multiprocessing as mp

lifo = mp.Queue(maxsize=1)