pool.apply_async需要很长时间才能完成,如何加快速度?

时间:2017-08-20 17:32:31

标签: python multiprocessing

我用24个核心调用pool.apply_async()。

   import multiprocessing 
   from time import time
   import timeit

   informative_patients = informative_patients_2500_end[20:]
   pool = multiprocessing.Pool(14)
   results = []
   wLength = [20,30,50]

   start = time()

   for fn in informative_patients:
        result = pool.apply_async(compute_features_test_set, args = (fn, 
        wLength), callback=results.append)

   pool.close()

   pool.join()


   stop = timeit.default_timer()

   print stop - start 

问题是它在不到一个小时内完成了对前13个数据调用compute_features_test_set()函数,但是完成最后一个数据需要一个多小时。所有14个数据集的数据大小相同。我尝试在pool.close()之后放置pool.terminate()但在这种情况下它甚至不启动池并立即终止池而不进入for循环。这总是以相同的方式发生,如果我使用更多核心和更多数据集,总是最后一个需要很长时间才能完成。我的compute_features_test_set()函数是一个简单的特征提取代码,可以正常工作。我在Linux red hat 6,python 2.7和jupyter的服务器上工作。计算时间对我来说很重要,我的问题是这里有什么问题以及我如何解决它以在合理的时间内完成所有计算?

1 个答案:

答案 0 :(得分:0)

  

问题:...这里有什么问题以及如何解决问题

无法将此问题视为multiprocessing问题 但是如何你得到了这个:"总是最后一个需要很长时间才能完成"
您使用的是callback=results.append而不是自己的function? 修改您的问题,并显示 timeit 一个处理时间。< 还要将Python版本添加到您的问题中。

执行以下操作以验证其不是数据问题

   start = time()
   results.append(
       compute_features_test_set(<First informative_patients>, wLength
       )
   stop = timeit.default_timer()
   print stop - start 

   start = time()
   results.append(
       compute_features_test_set(<Last informative_patients>, wLength
       )
   stop = timeit.default_timer()
   print stop - start 

比较你得到的两次。