Как реализовать LIFO для многопроцессорной обработки. Вопрос в Python?

Я понимаю разницу между очередью и стеком. Но если я порождаю несколько процессов и отправляю сообщения между ними, вставляю multiprocessing.Queue как получить доступ к последнему элементу, помещенному в очередь первым?

3 ответа

Вы можете использовать многопроцессорный менеджер, чтобы обернуть 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, Просто разделите два разных типа сообщений на две очереди.

Другие вопросы по тегам