Передача аргументов 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())
Помогите. Как запустить в пуле процессы, выполняющие отличные друг от друга функции.