我正在研究一个已经存在了十多年的大型Python代码库。有问题的应用程序使用forking来实现并行性。
基本前提是用户要求程序构建特定目标,我们为目标找出一个依赖图,然后从构建图中的拓扑分区中找出我们可以并行执行的一些任务。然后我们分叉一些进程来并行执行这些任务(来自分区)。
这一切都有效。但是我想重构它不依赖于fork()
。特别是,从子进程中可用的主进程依赖于状态这是一个问题。
重构有几个激励因素:
问题是分叉进程当前使用的很多数据结构(由主进程设置)不能轻易地序列化(也不能通过子进程推断它们的构造)。打开文件描述符就是这样一个例子,对象身份(构建图)的依赖性是另一个。
基本上,我正在寻求有关如何最好地全面解决这个问题的建议。
答案 0 :(得分:2)
我建议遵循范式
Master 是一个单一进程,可以执行所有依赖项解析,图形分区等,直至单个单个作业。因此,只有一个系统状态副本。
使用subprocess
或multiprocessing
或os.system
卸载这些叶子作业。
更简单的卸载机制,平台独立性越强:)
Leaves 当然是异步的,因此您需要一个用于处理异步通知的框架 - 您可以使用gevent
或一些实现futures
的库。如果你真的是铁杆,twisted
。 Python 3.x还引入了可能有用的asyncio
。
您还可以将资源/执行程序池与临时通知一起使用,例如:我认为post-order tranversal可以相对简单地使用递归函数实现,或者在你的情况下使用递归生成器。