【发布时间】:2015-03-09 03:10:35
【问题描述】:
我最初的问题是我正在尝试执行以下操作:
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()
decoder 在这里描述起来有点牵强,但重要的是,decoder 是一个使用调用 setParseAction() 的 PyParsing 表达式初始化的对象。这使多处理使用的泡菜失败,这反过来又使上述代码失败。
现在,这是我分离和简化的 pickle/PyParsing 问题。 由于 pickle 失败,以下代码会产生错误消息。
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))
我怎样才能绕过它?多处理使用泡菜,所以我想我无法避免它。据称使用 dill 的 pathos 包还不够成熟,至少,我在 Windows-64 位上安装它时遇到问题。我真的在这里摸不着头脑。
【问题讨论】:
-
~~rant~~:
pathos已经接近 10 年了......几乎一直在积极发展(嗯,定期)。它使用setuptools轻松安装。如果您使用pre标志,则可以使用pip安装它。我看不出它为什么不是一个“成熟”的包......除了最后一个稳定版本的版本号(在版本号标准改变之前不是问题)。总之,叹气。待定的新版本将处理pip安装问题纯粹由于版本编号。
标签: python pickle python-multithreading pyparsing python-multiprocessing