Передача аргументов Queue в мультипроцессинговый Pool

Мой первый пост/вопрос на сайте. Передаю входной и выходной Queue различным процессам, каждый из которых выполняет свою, но похожую на другие задачи: эддеры берут значения из очереди, помечают их индивидуальными метками и передают в другую общую очередь (попутно принтя для котроля), из которой анпакер все извлекает по мере поступления и принтит со своей меткой. Текстинг эддеров и анпакера не публикую, там ничего интересного. Их результат не важен, возвращается только для контроля. Важен сам ход их работы. Вариант с четырьмя отдельными процессами работает как положено:

inq, ouq = Queue(), Queue()
for i in range(INDEX1):
    inq.put(i)

proc1 = Process(target=adder1, args=(inq, ouq))
proc2 = Process(target=adder2, args=(inq, ouq))
proc3 = Process(target=adder3, args=(inq, ouq))
procu = Process(target=unpacker, args=(ouq,))

proc1.start()
proc2.start()
proc3.start()
procu.start()

proc1.join()
proc2.join()
proc3.join()
procu.join()

А вариант с пулом выдает ошибку:

inq, ouq = Queue(), Queue()
for i in range(INDEX1):
    inq.put(i)

with Pool() as pool:
    print('In pool context manager')
    res1 = pool.apply_async(adder1, args=(inq, ouq))
    res2 = pool.apply_async(adder2, args=(inq, ouq))
    res3 = pool.apply_async(adder3, args=(inq, ouq))
    res_un = pool.apply_async(unpacker, args=(ouq))

    print(res1.get(), res2.get(), res3.get(), res_un.get())

_pickle.PicklingError: Can't pickle <function adder1 at 0x7e1d06a78680>: attribute lookup adder1 on main failed

Вариант 3 (ниже) тоже не работает, хотя ошибку не кидает, если не пытаться считывать результат выполнения функций-процессов. Выглядит все так, как будто процессы в пуле просто не запускаются. Вариант 3 (фрагмент):

res = []

with Pool() as pool:
    print('In pool context manager')
    res.append(pool.apply_async(adder1, args=(inq, ouq)))
    res.append(pool.apply_async(adder2, args=(inq, ouq)))
    res.append(pool.apply_async(adder3, args=(inq, ouq)))
    res.append(pool.apply_async(unpacker, args=(ouq)))
for r in res:
    r.wait()
    #print(r.get())

Помогите. Как запустить в пуле процессы, выполняющие отличные друг от друга функции.


Ответы (0 шт):