簡體   English   中英

如何在python中為multiprocessing.Queue實現LIFO?

[英]How to implement LIFO for multiprocessing.Queue in python?

我了解隊列和堆棧之間的區別。 但是,如果我生成多個進程並在它們之間發送消息放入multiprocessing.Queue我如何首先訪問放入隊列的最新元素?

您可以使用多處理管理器來包裝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()

如果你只關心最新的值或對象,設置 maxsize = 1

import multiprocessing as mp

lifo = mp.Queue(maxsize=1)

multiprocessing.Queue不是數據類型。 它是在兩個進程之間進行通信的一種方式。 它無法與Stack相提並論

這就是為什么沒有 API 可以從隊列中彈出最后一項。

我認為您的想法是使某些消息具有比其他消息更高的優先級。 當它們被發送到偵聽進程時,您希望盡快將它們出列,繞過隊列中的現有消息。

您實際上可以通過創建兩個multiprocessing.Queue來實現此效果:一個用於普通數據有效負載,另一個用於優先級消息。 那么您無需擔心getting the last item 只需將兩種不同類型的消息隔離到兩個隊列中即可。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM