获取“_thread.lock”对象的方法需要大量时间|并行计算

2024-09-30 18:23:17 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试使用ProcessPoolExecutor解决多个子问题(sp是类SP的对象)。下面是我用来做这件事的函数:

 def get_sp_sol_(self, remove, duals, df_duals, df_duals_3):  
      for sp in self.sP.values(): #  I used to update these values using class attributes outside of this function but it seems that setting class attributes does not work with conccurency
            sp.Duals =duals
            sp.BrDuals = df_duals
            sp.BrDuals_3 = df_duals_3
            sp.rem =remove
      with concurrent.futures.ProcessPoolExecutor(max_workers=6) as executor:
            results = [executor.submit(sp.solve_) for sp in self.sP.values()]
            lis_res = []

            for f in results:
                res = self.convert_labels_rdp(f.result()[0],f.result()[1] )
                lis_res.extend([self.add_rdps(tuple(r), rdp) for r, rdp in res])
       
    return lis_res

在不进行多重处理的情况下求解时,大约需要11秒,而在使用多重处理时,大约需要70秒

我运行分析器,得到如下结果:enter image description here 我检查了关于这个问题的其他问题,但似乎没有人回答为什么多重处理比串行计算花费的时间要长得多。 solve_函数在这里很长。它在另一个文件(类SP)中定义,并从同一个类SP调用函数,从其他类/文件调用一些常量和一些对象

为什么使用多处理解决问题需要更长的时间


Tags: 对象函数inselfdfforresrdp