如何重构依赖于fork()复制状态的Python代码

时间:2014-05-30 11:07:09

标签: python multiprocessing fork state

我正在研究一个已经存在了十多年的大型Python代码库。有问题的应用程序使用forking来实现并行性。

基本前提是用户要求程序构建特定目标,我们为目标找出一个依赖图,然后从构建图中的拓扑分区中找出我们可以并行执行的一些任务。然后我们分叉一些进程来并行执行这些任务(来自分区)。

这一切都有效。但是我想重构它不依赖于fork()。特别是,从子进程中可用的主进程依赖于状态这是一个问题。

重构有几个激励因素:

  1. 我希望Linux之间的代码尽可能相似 和Windows(目前在Windows上我们执行非分叉构建, 因此没有并行性)
  2. 分叉有点难看 我想做的其他重构(基本上,我想要更多 集中控制和监控建筑物)。而不是分叉, 我想通过Python Multiprocessing模块(我已经完成了) 在过去使用,效果很好)。
  3. 问题是分叉进程当前使用的很多数据结构(由主进程设置)不能轻易地序列化(也不能通过子进程推断它们的构造)。打开文件描述符就是这样一个例子,对象身份(构建图)的依赖性是另一个。

    基本上,我正在寻求有关如何最好地全面解决这个问题的建议。

1 个答案:

答案 0 :(得分:2)

我建议遵循范式

Master 是一个单一进程,可以执行所有依赖项解析,图形分区等,直至单个单个作业。因此,只有一个系统状态副本。

使用subprocessmultiprocessingos.system卸载这些叶子作业。

更简单的卸载机制,平台独立性越强:)

Leaves 当然是异步的,因此您需要一个用于处理异步通知的框架 - 您可以使用gevent或一些实现futures的库。如果你真的是铁杆,twisted。 Python 3.x还引入了可能有用的asyncio

您还可以将资源/执行程序池与临时通知一起使用,例如:我认为post-order tranversal可以相对简单地使用递归函数实现,或者在你的情况下使用递归生成器。