【问题标题】:parallel computations with task manager使用任务管理器进行并行计算
【发布时间】:2016-05-09 20:56:53
【问题描述】:

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

  • 据我了解,windows 中的 forks 很昂贵
  • 细粒度的进程管理(信号,即 SIGSTOP/SIGCONT)很笨重(即超出语言范围)

这些是任务要求:

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

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

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

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

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

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

有什么想法吗?

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

【问题讨论】:

  • 你可以试试python线程pymotw.com/2/threading
  • python 线程不是并行的,我不需要共享状态。
  • 还有:“目前,没有优先级,没有线程组,线程不能被销毁、停止、挂起、恢复或中断”。 - 所以也不适合这些原因。
  • Celery 呢?
  • "当一个新任务启动时,任务管理器可能会根据预定的限制暂停其他任务" -> "可以" 表示这不是强制性的 ?您的任务“执行时间长”是否超过 500 万?或者他们几乎是瞬间被无数?你受CPU限制吗? IO绑定?为@Vincent +1,Celery 呢?

标签: python parallel-processing python-asyncio python-stackless


【解决方案1】:

哇,这个问题太老了,我很惊讶 Stackless Python 用户还没有加入...

再说一次,Stackless Python 已经/现在遥遥领先,我们很少有人将它投入使用。

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

Stackless Python Wiki

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多