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

2024-09-29 23:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个大型的ishpython代码库,它已经存在了十多年了。所讨论的应用程序利用forking实现并行性。在

基本前提是用户要求程序建立一个特定的目标,我们计算出目标的依赖关系图,然后从构建图中的拓扑划分中找出一些可以并行执行的任务。然后我们派生一些进程以并行地执行这些任务(从分区)。在

一切都很管用。不过,我想重构它而不是依赖fork()。尤其是,子进程中主进程对状态的依赖性是一个问题。在

重构有两个激励因素:

  1. 我希望Linux之间的代码尽可能相似 和Windows(目前在Windows上我们执行非分叉构建, 因此没有平行性)
  2. 叉子就有点难看了 我想做的其他重构(基本上,我希望有更多的重构) 建筑物的集中控制和监控)。而不是叉子, 我想了解一下Python多处理模块(我已经 过去用过,效果很好)。在

问题是,分叉进程(由主进程设置)当前使用的大量数据结构不容易序列化(也不能推断出它们用于子进程的构造)。开放文件描述符就是这样一个例子,依赖于对象标识(构建图)是另一个例子。在

基本上,我在寻找如何最好地整体解决这个问题的建议。在


Tags: 代码用户程序应用程序利用目标进程windows
1条回答
网友
1楼 · 发布于 2024-09-29 23:32:25

我建议遵循以下范例

Master是一个单独的进程,负责所有的依赖关系解析、图划分等,直至单个、单独的作业。因此只有一个系统状态副本。在

使用subprocessmultiprocessing或{}卸载这些叶作业。在

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

当然是异步的,因此您需要一个框架来处理异步通知,您可以使用gevent或实现{}的库。如果你是真正的铁杆,twisted。python3.x还引入了asyncio,这可能很有用。在

您还可以使用带有特殊通知的资源/执行器池,例如post-order tranversal,我认为可以相对简单地使用递归函数或递归生成器来实现。在

相关问题 更多 >

    热门问题