我需要在 python 中运行一些并行计算。我能想到的唯一兼容的方法是多进程/分叉模型,由于以下几个原因,它不太理想:
- 据我了解,窗户上的叉子很贵
- 细粒度的进程管理(信号,即 SIGSTOP/SIGCONT)很笨重(即在语言之外)
这些是任务要求:
- 任务可能会产生新任务
- 任务必须在任务管理器中注册
- 任务不需要共享状态
- 任务必须返回一个值(python 对象)
任务管理器负责调度和限制并发任务的数量。这些是任务管理器要求:
- 当一个新任务开始时,任务管理器可以根据预定的限制暂停其他任务
- 当一个任务返回时,任务管理器可能会继续其他挂起的任务
- 当请求任务的返回值时,任务管理器可能会重新组织任务优先级(防止死锁)
所以你看,任务管理器不需要是并行/并发进程。每个任务可以在启动或停止时对任务管理器进行同步调用。等待其他任务的任务也可能进行同步调用。
我似乎想不出任何其他方法:
- asyncio 可以在有限的池中启动并行进程,但这种方法更适合数据并行而不是任务抢占。从外部抢占任务(挂起)与协作编程的事件不兼容。如果我错了,请纠正我,但是虽然我可以使用 asyncio,但它不会让我的生活更轻松(没有好处的抽象),因为我仍然需要使用进程,并在“任务启动/停止”事件上发出信号?
- 无堆栈 python 可能是合适的,但它不是真正的 python?
有任何想法吗?
PS 我的最终目标是自动并行化(装饰)函数调用。任务管理器限制并行执行的任务数量(即递归函数)以避免颠簸(叉子炸弹)。我需要使用 python,即使懒惰(任务等待)、纯(无共享状态)和无堆栈(轻量级线程)语言可能更合适......