Python Glossary English

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

multiprocessing.Queue

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

Очередь для обмена объектами между процессами: put() в одном, get() в другом. Объекты передаются через pickle фоновым потоком.

Синтаксис

q = ctx.Queue(maxsize=0); q.put(obj); q.get(block=True, timeout=None)

put() возвращается сразу, а pickle и отправку делает фоновый поток — поэтому ошибка «нельзя сериализовать» вылетает не из put(), а печатается в stderr, и объект молча пропадает. Ребёнок, положивший в очередь много данных, не завершится, пока их не заберут: join() до get() — классический дедлок, сначала читайте. qsize() на macOS бросает NotImplementedError, а empty() ненадёжна; get(timeout=...) бросает queue.Empty из обычного модуля queue.

Примеры

import multiprocessing as mp
def worker(q, n):
    q.put(n * n)
if __name__ == '__main__':
    ctx = mp.get_context('spawn')
    q = ctx.Queue()
    ps = [ctx.Process(target=worker, args=(q, n)) for n in (2, 3)]
    for p in ps:
        p.start()
    results = sorted(q.get(timeout=10) for _ in ps)  # сначала читаем, потом join
    for p in ps:
        p.join()
    print(results)  # → [4, 9]
import multiprocessing as mp
import queue
if __name__ == '__main__':
    q = mp.get_context('spawn').Queue()
    q.put(lambda: 1)  # pickle упадёт в фоновом потоке, не здесь
    print('put returned')  # → put returned
    try:
        q.get(timeout=0.5)
    except queue.Empty:
        print('nothing arrived')  # → nothing arrived

См. также

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