Моя первоначальная проблема в том, что я пытаюсь сделать следующее:
def submit_decoder_process(decoder, input_line):
decoder.process_line(input_line)
return decoder
self.pool = Pool(processes=num_of_processes)
self.pool.apply_async(submit_decoder_process, [decoder, input_line]).get()
декодер немного задействован для описания здесь, но важно то, что декодер является объектом, который инициализируется выражением PyParsing, которое вызывает setParseAction(). Это не позволяет определить, что использует многопроцессорность, и это, в свою очередь, не позволяет выполнить вышеуказанный код.
Теперь вот проблема рассола /PyParsing, которую я выделил и упростил. Следующий код дает сообщение об ошибке из-за сбоя рассола.
import pickle
from pyparsing import *
def my_pa_func():
pass
pickle.dumps(Word(nums).setParseAction(my_pa_func))
Сообщение об ошибке:
pickle.PicklingError: Can't pickle <function wrapper at 0x00000000026534A8>: it not found as pyparsing.wrapper
Теперь, если вы удалите вызов .setParseAction(my_pa_func), он будет работать без проблем:
pickle.dumps(Word(nums))
Как я могу обойти это? Многопроцессор использует рассол, поэтому я не могу этого избежать. Патсовый пакет, который предположительно использует укроп, недостаточно зрелый, по крайней мере, у меня возникают проблемы с его установкой на моем Windows-64bit. Я действительно почесываю голову здесь.