3

我需要在 python 中运行一些并行计算。我能想到的唯一兼容的方法是多进程/分叉模型,由于以下几个原因,它不太理想:

  • 据我了解,窗户上的叉子很贵
  • 细粒度的进程管理(信号,即 SIGSTOP/SIGCONT)很笨重(即在语言之外)

这些是任务要求:

  • 任务可能会产生新任务
  • 任务必须在任务管理器中注册
  • 任务不需要共享状态
  • 任务必须返回一个值(python 对象)

任务管理器负责调度和限制并发任务的数量。这些是任务管理器要求:

  • 当一个新任务开始时,任务管理器可以根据预定的限制暂停其他任务
  • 当一个任务返回时,任务管理器可能会继续其他挂起的任务
  • 当请求任务的返回值时,任务管理器可能会重新组织任务优先级(防止死锁)

所以你看,任务管理器不需要是并行/并发进程。每个任务可以在启动或停止时对任务管理器进行同步调用。等待其他任务的任务也可能进行同步调用。

我似乎想不出任何其他方法:

  • asyncio 可以在有限的池中启动并行进程,但这种方法更适合数据并行而不是任务抢占。从外部抢占任务(挂起)与协作编程的事件不兼容。如果我错了,请纠正我,但是虽然我可以使用 asyncio,但它不会让我的生活更轻松(没有好处的抽象),因为我仍然需要使用进程,并在“任务启动/停止”事件上发出信号?
  • 无堆栈 python 可能是合适的,但它不是真正的 python?

有任何想法吗?

PS 我的最终目标是自动并行化(装饰)函数调用。任务管理器限制并行执行的任务数量(即递归函数)以避免颠簸(叉子炸弹)。我需要使用 python,即使懒惰(任务等待)、纯(无共享状态)和无堆栈(轻量级线程)语言可能更合适......

4

1 回答 1

0

哇,这个问题很老了,我很惊讶 Stackless Python 用户没有插话......

再说一次,Stackless Python 已经/现在远远领先于它的时代,而且我们很少有人将它投入使用。

Stackless Python 确实是 Python。它不仅仅是 Python,但它仍然是 Python。

无堆栈 Python 维基

我认为它非常适合您的需求。它仍然是最新的,并且在本月最近的一次提交中得到维护。它相当可靠,并且非常适合我的需求。

于 2019-07-26T18:18:44.470 回答