1

marshal我正在尝试使用 map 和 reduce 函数运行 Disco 作业,这些函数在使用库通过 TCP 套接字传递后被反序列化。具体来说,我用

code = marshal.loads(data_from_tcp)
func = types.FunctionType(code, globals(), "func")

我已经在同一系统上测试了普通的 Disco 作业(具有本地定义的功能),并且它们运行良好。但是,当我使用新功能运行 Disco 作业时,作业不断失败并且我不断收到错误消息localhost WARNING: [map:0] Could not parse worker event: invalid_length

我搜索了文档,没有提到我可以找到“工人事件”或invalid_length. 在对源代码执行 grep 后,我找到了短语“无法解析工作者事件:”的单个实例,特别是在文件master/src/disco_worker.erl. 我不熟悉 Erlang,也不知道它是如何工作的。

是什么导致了这个问题?我应该做其他事情来规避它吗?

编辑:经过更多调试,我意识到这个错误与我在测试用例函数中使用 string.split() 方法有关。无论何时使用它(即使在不属于输入的字符串上),都会引发此错误。我已经验证该方法确实存在于对象上,但调用它似乎会导致问题。有什么想法吗?

编辑 2:此外,任何使用 re.split 函数都可以达到相同的效果。

编辑 3:似乎在 map 函数中的输入字符串上调用任何字符串函数都会产生同样的错误。

4

1 回答 1

2

在我的情况下,当我在 map 函数中向 sys.stderr 打印一些东西时,总是会出现这个警告(并且作业最终失败了)。工人协议的文档说:工人不应该向标准错误写入任何内容,除了如下所述格式化的消息。stdout 最初也被重定向到 stderr。

于 2012-05-15T23:32:11.360 回答