multiprocessing.apply_async фактически не запускается при передаче объекта queue.Queue - PullRequest
0 голосов
/ 22 сентября 2019

Я действительно расстроен.Почему Python multiprocessing.apply_async () фактически не запускает процесс, когда объект очереди передается в качестве аргумента или части аргумента?

Этот код работает должным образом:

#! /usr/bin/env python3

import multiprocessing
import queue
import time

def worker(var):
    while True:
        print("Worker {}".format(var))
        time.sleep(2)

pool = multiprocessing.Pool(20)
m = multiprocessing.Manager()
q = queue.Queue()

for i in range(20):
    pool.apply_async(worker, (i,))

print("kicked off workers")
pool.close()
pool.join()

Но, просто пройдя очередь q, при ее запуске ничего не происходит:

#! /usr/bin/env python3

import multiprocessing
import queue
import time

def worker(var,q):
    while True:
        print("Worker {}".format(var))
        time.sleep(2)

pool = multiprocessing.Pool(20)
m = multiprocessing.Manager()
q = queue.Queue()

for i in range(20):
    pool.apply_async(worker, (i,q))

print("kicked off workers")
pool.close()
pool.join()

Снова;супер расстраиваетЧто, черт возьми, происходит?Что я делаю не так?

1 Ответ

1 голос
/ 22 сентября 2019

Если вы хотите поделиться Queue между процессами, вам нужно создать прокси для одного с multiprocessing.managers.SyncManager.Queue.

import multiprocessing
import time


def worker(var, q):
    while True:
        print("Worker {}".format(var))
        time.sleep(2)


if __name__ == '__main__':  # Be sure to include this.

    pool = multiprocessing.Pool(20)
    mgr = multiprocessing.Manager()
    q = mgr.Queue()  # Create a shared queue.Queue object.

    for i in range(20):
        pool.apply_async(worker, (i,q))

    print("kicked off workers")
    pool.close()

    print('joining pool')
    pool.join()

    print('done')
...