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

2022-01-21 00:00:00 python queue python-multiprocessing lifo

问题描述

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

I understand the difference between a queue and stack. But if I spawn multiple processes and send messages between them put in multiprocessing.Queue how do I access the latest element put in the queue first?


解决方案

你可以使用 多处理管理器 来包装 队列.LifoQueue 做你想做的事.

You can use a multiprocessing manager to wrap a queue.LifoQueue to do what you want.

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()

相关文章