Python Glossary English

все Python 3multiprocessingпонятие

multiprocessing.JoinableQueue

обмен данными

Очередь процессов с учётом выполненных задач: потребитель зовёт task_done() на каждый get(), а join() ждёт, пока все положенные задачи не будут отмечены.

Синтаксис

q = ctx.JoinableQueue(); q.put(x); q.get(); q.task_done(); q.join()

Забытый task_done() — и q.join() висит вечно, причём без всякой ошибки; лишний вызов даёт ValueError. task_done() зовут и для «ядовитой» метки остановки (None), иначе счётчик не сойдётся. Как и у Queue, потребитель обычно бесконечный цикл, поэтому после q.join() его нужно остановить — меткой или daemon=True.

Примеры

import multiprocessing as mp
def consumer(q, out):
    while True:
        item = q.get()
        if item is None:
            q.task_done()
            break
        out.put(item * 10)
        q.task_done()
if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q, out = ctx.JoinableQueue(), ctx.Queue()
    p = ctx.Process(target=consumer, args=(q, out))
    p.start()
    for item in (1, 2, 3, None):
        q.put(item)
    q.join()  # ждёт task_done() на каждый put()
    print(sorted(out.get(timeout=10) for _ in range(3)))  # → [10, 20, 30]
    p.join()

См. также

Открыть в полном глоссарииdocs.python.orgСообщить о неточности