gpt4 book ai didi

python - 使用 multiprocessing.pool map() 时,pyparsing.asDict 出现 MaybeEncodingError

转载 作者:太空宇宙 更新时间:2023-11-03 11:30:26 24 4
gpt4 key购买 nike

我正在尝试使用 multiprocessing.pool 来加速使用 pyparsing 解析的文件的某些解析,但是我得到了一个 multiprocessing.pool.MaybeEncodingError 每当我尝试这个时都会出现异常。

我已将其缩小到与返回字典 (ParseResults.asDict()) 有关的范围,使用 asList() 不会发生错误;但是我实际解析的输入非常复杂,所以理想情况下我想使用 asDict

正在解析的实际数据是标记元组的 Erlang 列表,我想将其映射到 python 列表。这个语法非常复杂,所以我得到了一个简化的测试用例(更新为包含一个嵌套的字典):

#!/usr/bin/env python2.7
from pyparsing import *
import multiprocessing

dictionary = Forward()
key = Word(alphas)
sep = Suppress(":")
value = ( key | dictionary )
key_val = Group( key + sep + value )
dictionary <<= Dict( Suppress('[') + delimitedList( key_val ) + Suppress(']') )

def parse_dict(s):
p = dictionary.parseString(s).asDict()
return p

def parse_list(s):
return dictionary.parseString(s).asList()

# This works (list)
data = ['[ foo : [ bar : baz ] ]']
pool = multiprocessing.Pool()
pool.map(parse_list, data)

# This fails (dict)
pool.map(parse_dict, data)

失败:

Traceback (most recent call last):
File "lib/python/nutshell/multi_parse.py", line 19, in <module>
pool.map(parse, data)
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 250, in map
return self.map_async(func, iterable, chunksize).get()
File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/multiprocessing/pool.py", line 554, in get
raise self._value
multiprocessing.pool.MaybeEncodingError: Error sending result: '[{'foo': ([(['bar', 'baz'], {})], {'bar': [('baz', 0)]})}]'. Reason: 'TypeError("'str' object is not callable",)'

最佳答案

更新:自更新以来问题发生了重大变化。原来不可拾取的点仍然存在,并留在下面。

你说在你的语法中你使用了 delimitedList ,所以让我们将其添加到我们的测试用例中:

data = ['[ foo : [ bar : baz ], cat:dog ]']

你的“dictionary”语法对象没有理由是 python 字典,它是一个列表。如果你不是说你必须改变delimitedList到别的东西。我已经更新了语法以允许使用 parseAction 进行适当的酸洗。 :

dictionary = Forward()
key = Word(alphas)
LP, RP, sep = map(Suppress, "[]:")
value = key | dictionary
key_val = key("key") + sep + value("val")
dictionary <<= LP + delimitedList( key_val ) + RP

def parse_key_val(x): return {x.key:x.val}
key_val.setParseAction(parse_key_val)

def parse_dict(s):
# Yes, it's a list, not a dict!
return dictionary.parseString(s).asList()

def parse_list(s):
return dictionary.parseString(s).asList()

这给出了并行的工作答案:

[[{'foo': {'bar': 'baz'}}, {'cat': 'dog'}]]

原始答案:我认为 multiprocessing 失败,因为它不能腌制对象。你认为你有一个字典,但如果你看:

def parse_dict(s):
val = lang.parseString(s).asDict()
print type(val["foo"])
return val

你会发现内部类型是 <class 'pyparsing.ParseResults'> .我不确定如何申请 pp.Dict递归地,但一个非常简单的解决方法是改变你的语法:

value = ( Word(alphas) )
sep = Suppress(":")
key_val = Group( value + sep + value )
lang = Dict( Suppress('[') + delimitedList( key_val ) + Suppress(']') )

现在允许 pp.Dict以正常运行。无论如何,我发现我的许多多处理问题都来自无法正确序列化的对象,因此它通常是我首先查看的地方。

一个有用且相关的问题:

Can't get pyparsing Dict() to return nested dictionary

关于python - 使用 multiprocessing.pool map() 时,pyparsing.asDict 出现 MaybeEncodingError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21684611/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com