使用共享变量进行多线程处理

时间:2018-02-21 10:31:39

标签: python multithreading

我有这个程序:

def optimal(t0, tf, frequences, delay, ratio = 0):

    First = True              
    for s in delay:
        delay = 0                           
        timelines = list()

        for i in range(len(frequences)):
            timelines.append(time_builder(frequences[i], t0+delay, tf))
            delay += s

        It takes in input an initial time t0, a final time tf, a list of 5 frequencies, and this `

如果值s符合要求i.e valid = Trueoptim_param_1 < optimal[3],那么最佳值将替换为optimal = (s, _overlap, __trio_overlap, optim_param_1)

问题是s有很多可能性被测试,并且内部计算很长。我想使用几个线程来加速这个过程。我从来没有真正做到这一点而且我已经阅读了有限制和算法设计选择,以避免错误的结果。

第一个问题,是否可以将此算法修改为多线程? 第二个问题,from threading import Thread是正确的解决方案吗? 第三个问题,因为线程之间共享最优(比较以确定解决方案是否优于以前的最佳解决方案),我应该为每个线程创建一个最优然后比较哪个最优是最好的,还是有另一种方式?

感谢您的提示,我真的不知道从多线程开始......

编辑:某些s值计算可能很快,有些很长。没有2个具有相同的持续时间。

1 个答案:

答案 0 :(得分:1)

我目前没有时间创建扩展答案,但仍想提供一些提示。

  1. 由于您的计算不直接相互依赖,因此可以并行化问题。
  2. 使用threading.Thread不是正确的解决方案,因为它在同一进程中运行所有线程。请改用multiprocessing.Processhttps://docs.python.org/3.6/library/multiprocessing.html)。界面类似于threading.Thread
  3. 我能想象至少有两种解决方案:
    • 每个进程使用一个optimal变量来存储该进程的最佳值。当optim_param_1 < 0.3满足时,您当前的程序将停止。因此,当一个进程找到multiprocessing.Event的解决方案时,您可以设置共享optim_param_1 < 0.3。然后,所有其他线程可以在设置事件时自行停止。
    • 在工作进程和主进程之间共享multiprocessing.Queue。只要工作进程计算出新结果,就将其放入队列中。主进程应在循环中检查队列中的新结果,并将结果与​​其optimal变量进行比较。当它找到满足optim_param_1 < 0.3的解决方案时,它可以停止所有工作进程。
  4. 我个人会选择第二种解决方案。它将结果的计算(在工人流程中)与结果的估值(在主流程中)分开。 您可以使用multiprocessing.pool.Pool类轻松扩展和管理整个事物。

    多处理模块的文档有一些很好的例子:https://docs.python.org/3.6/library/multiprocessing.html#examples