Моего первоначального вопроса в том, что я пытаюсь сделать следующее:Невозможно рассортировать выражение Pyparsing с помощью метода setParseAction(). Необходимое для многопроцессорных
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's not found as pyparsing.wrapper
Теперь Если вы удалите .setParseAction вызова (my_pa_func), он будет работать без проблем:
pickle.dumps(Word(nums))
Как я могу обойти это? Многопроцессор использует рассол, поэтому я не могу этого избежать. Патсовый пакет, который предположительно использует укроп, недостаточно зрелый, по крайней мере, у меня возникают проблемы с его установкой на моем Windows-64bit. Я действительно царапаю голову здесь.
~~ rant ~~: 'пафос' близок к 10-летнему ... с активным развитием почти все время (ну, периодически). Это тривиально устанавливается с помощью 'setuptools'. Он может быть установлен с помощью 'pip', если вы используете флаг' pre'. Я не вижу, как это не «зрелый» пакет ... кроме номера версии последнего стабильного выпуска (который * был * не проблемой до тех пор, пока стандарты номера версии не изменились). В любом случае, вздох. Ожидающий новый выпуск позаботится о проблемах с установкой 'pip' * чисто * из-за нумерации версий. –