[英]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.