【问题标题】:Python Multiprocessing - how to make processes wait while active?Python Multiprocessing - 如何让进程在活动时等待?
【发布时间】:2014-11-07 12:25:12
【问题描述】:

好吧,我对 python 和多处理还是很陌生,我需要知道的是,是否有任何方法可以让活动进程等待类似“所有进程都使用给定资源完成”,然后继续他们的工作。是的,我真的需要他们等待,主要目的与同步有关。这不是关于完成进程并加入它们,而是在它们运行时等待,我应该使用条件/事件之类的东西吗?我在任何地方都找不到真正有用的东西。

应该是这样的:

import multiprocessing

def worker(args):
    #1. working
    #2. takes the resource from the manager
    #3. waits for all other processes to finish the same step above
    #4. returns to 1.

if __name__ == '__main__':
    manager = multiprocessing.Manager()
    resource = manager.something()
    pool = multiprocessing.Pool(n)
    result = pool.map(worker, args)
    pool.close()
    pool.join()

编辑:“工作”部分比其他部分花费更多时间,所以我仍然利用多处理,即使对单个资源的访问是串行的。假设问题是这样工作的:我有多个进程运行解决方案查找器(一种进化算法),并且每个“n”解决方案,我使用该资源在这些进程之间交换一些数据并使用信息改进解决方案。所以,我需要他们所有人在交换该信息之前等待。这有点难以解释,我并不是真的在这里讨论这个理论,我只是想知道是否有任何方法可以做我试图在主要问题中描述的内容。

【问题讨论】:

  • 那么重点是什么?看起来您将使用同步原语来序列化您的多个进程。如果是这样,为什么要使用多个进程?
  • 你能把你的例子更具体一些吗?
  • John Zwinck,Janne Karila,我在主要问题中添加了一些信息。

标签: python synchronization multiprocessing


【解决方案1】:

我不确定,我是否理解您的问题。但我认为你可以使用Queue。将数据从一个进程传输到另一个进程是一个很好的解决方案。你可以实现类似的东西:

1. Process first chunk
2. Write results to queue
3. Waits until queue is not full
4. Returns to 1

【讨论】:

  • 但是我如何确保工作进程将按照定义的顺序使用队列,或者至少等到所有其他进程都完成它的部分?
  • 您需要将数据从一个进程传输到另一个进程吗?如果没有,您可以尝试stackoverflow.com/questions/26821856/… 的第一个解决方案
【解决方案2】:

我实际上找到了一种方法来做我想做的事。 正如您在问题中看到的那样,代码在流程中使用了管理器。所以,简单来说,我制作了一个共享资源,它的工作原理基本上就像一个“日志”。每次进程完成其工作时,它都会在日志中写入一个权限。一旦所有所需的权限都在那里,进程将继续工作(例如,使用它,我可以为资源设置特定的访问顺序)。 请注意,这不是锁或信号量。 我想这根本不是一个好方法,但它适合问题的需要并且不会延迟执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-16
    • 2018-03-08
    相关资源
    最近更新 更多