Как убедиться, что многопроцессорная очередь пуста

alphanumeric спросил: 07 октября 2018 в 01:42 в: python

Приведенный ниже код сначала запускает несколько процессов. Затем он запускает цикл while True, проверяющий объекты queue. Наконец, он повторяет процессы, чтобы проверить, живы ли они. После того, как все процессы завершены, это breaks цикл while. К сожалению, это происходит, когда объект queue не пуст. Прерывание цикла без получения данных, хранящихся в queue, может легко контролировать потерю данных. Как изменить логику кода, чтобы он гарантировал, что объект queue пуст перед тем, как разорвать цикл?

import time, multiprocessing, os
logger = multiprocessing.log_to_stderr()def foo(*args):
    for i in range(3):
        queue = args[0]
        queue.put(os.getpid())items = dict()
for i in range(5):
    queue = multiprocessing.Queue()
    proc = multiprocessing.Process(target=foo, args=(queue,))
    items[proc] = queue
    proc.start()
    time.sleep(0.1)while True:
    time.sleep(1)    for proc, queue in items.items():
        if not queue.empty():
            print(queue.get())     if not True in [proc.is_alive() for proc in items]:
        if not queue.empty():
            logger.warning('...not empty: %s' % queue.get()) 
        break 

0 ответов