Multiprocessing Pipe() Wrapper Broken: 有东西挂了。 V5

Posted

技术标签:

【中文标题】Multiprocessing Pipe() Wrapper Broken: 有东西挂了。 V5【英文标题】:Multiproccessing Pipe() Wrapper Broken: Something is Hanging. V5 【发布时间】:2020-12-20 03:03:22 【问题描述】:

增强的 Python 多处理数据管道包装器

这就是目标……

目标

这是我正在进行的一个大项目的一部分。这是一个重要的部分,将大大简化我的程序中的报告传输。该程序针对数百万个输入测试一个函数,并使用多处理来加快速度。 Source code on Pastebin.

目标和好处

简单地说,multiprocessing.Pipe() 是不够的。它应该能够处理大量字符串并在发送者和接收者之间切换进程执行。我写这个来实现:

自动错误处理 传输错误分类 数据传输分块和重组 无限数据传输大小 进程同步 提高可用性的简单抽象

以前的问题

它有一个我找不到的奇怪错误。几天和大量文档之后,它没有修复。我留下了很多调试行。尝试输入“hi”:您看不到“Receiver.Test: Output: hi”,但应该。再试一次,它就挂了:Sample output。

由一位亲爱的朋友修复。

测试

GPE 有效。前两个测试都有效。对于测试 1,此 source code 正确且一致地输出 these results。对于测试 2,此 source code 正确输出类似于 these results 的内容。对于测试 3,此 source code 正确输出类似于 these results 的内容。

恳求!

是时候寻求帮助了。它是一个更大项目的一部分。公平地说,有很多行代码。这应该是multiprocessing 模块的一部分。我很谦虚。有人能告诉我怎么回事吗?请?有人吗??

没有人回答...

【问题讨论】:

你的代码很难理解——一个包含多个逻辑分支的内衬,以及深度嵌套的函数(即:get_ps_id)。我想几乎任何重大的错误都很难在这个模块中找到。考虑更多地分解代码和单元测试,你会发现你的错误,最终模块将具有测试覆盖率并且更易于维护。 这个观察很可能有很大的可信度。我只是以(诚然)非调试器友好的方式将我的代码分块。我讨厌雾化代码。这就是 C++ 的用途。在 Python 中,一行应该是一个句子……我想我更喜欢复杂复合句……但是,你没有看错。 你已经看过 IPython Parallel 了吗?它允许您使用更高级别的接口进行并行计算,并且具有比multiprocessing 更多的功能。 ipyparallel.readthedocs.io/en/latest/intro.html 【参考方案1】:

问题

receive_oscillate 中,yield from 看起来永远不会清除。

注意事项

此外,深度嵌套的函数和一个线性复合条件对 Python 来说并不特殊。此外,分解深层嵌套的函数并添加自动化单元测试将有助于减少错误并促进维护。

【讨论】:

是的。如果您发送键盘中断,您可以确定发送方挂起,因为接收方不会处理任何输入。

以上是关于Multiprocessing Pipe() Wrapper Broken: 有东西挂了。 V5的主要内容,如果未能解决你的问题,请参考以下文章

Multiprocessing Pipe() Wrapper Broken: 有东西挂了。 V5

使用multiprocessing 克服GIL缺陷-- 进程间通讯

Python--线程队列(queue)multiprocessing模块(进程对列Queue管道(pipe)进程池)协程

pipe和queue.py

python 中的multiprocessing 模块

python 学习笔记 - Queue & Pipes,进程间通讯