все 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Сообщить о неточности