невозможно заставить mp.pool работать с разными аргументами для разных процессов - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь распараллелить кусок кода, используя библиотеку multiprocessing, наброски которой следующие:

import multiprocessing as mp
import time
def stats(a,b,c,d,queue):
   t = time.time()
   x = stuff
   print(f'runs in {time.time() -t} seconds')
   queue.put(x)

def stats_wrapper(a,b,c,d):
   q = mp.Queue()
   # b here is a dictionary
   processes = [mp.Process(target = stats,args = (a,{b1:b[b1]},c,d,q) for b1 in b]
   for p in processes:
     p.start()
   results = []
   for p in processes:
     results.append(q.get())
   return(results)

Идея состоит в том, чтобы распараллелить вычисления в stuff, создав столько же процессов, сколько есть пар ключ: значение в b, что может go до 50. Я получаю ускорение всего на 20% по сравнению с последовательной реализацией.

Я попытался переписать функцию stats_wrapper с помощью mp.Pool, но не смог заставить функцию apply.async работать с другими args, как я создал в stats_wrapper выше.

Вопросы: -

  1. Как улучшить функцию stats_wrapper, чтобы еще больше сократить время выполнения?
  2. Есть ли способ переписать stats_wrapper с использованием функции mp.Pool, которая может принимать другое значение для параметра b в функции stats для разных процессов? Примерно так:

    def pool_stats_wrapper(a,b,c,d):
        q = mp.Queue
        pool = mp.Pool()
    
        pool.apply_async(stats,((a,{b1:b[b1},c,d) for b1 in b)) # Haven't figured this part yet
        pool.close()
        results = []
        for _ in len(b):
           results.append(q.get())
        return (results)
    

Я запускаю код на 8-ядерном компьютере с 16 ГБ, если это поможет. Я пробовал вещи, упомянутые в этой ветке, но это не сильно помогло

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...