Mulitprocess Pools с различными функциями - PullRequest
16 голосов
/ 08 августа 2011

Большинство примеров многопроцессорных рабочих пулов выполняют одну функцию в разных процессах, например

def foo(args):
   pass

if __name__ == '__main__':
   pool = multiprocessing.Pool(processes=30)
   res=pool.map_async(foo,args)

Есть ли способ обработки двух разных и независимых функций в пуле?Чтобы вы могли назначить 15 процессов для foo () и 15 процессов для bar () или пул ограничен одной функцией?Или вам нужно вручную создать разные процессы для разных функций с помощью

 p = Process(target=foo, args=(whatever,))
 q = Process(target=bar, args=(whatever,))
 q.start()
 p.start()

и забыть о рабочем пуле?

Ответы [ 3 ]

21 голосов
/ 08 августа 2011

Чтобы передать разные функции, вы можете просто вызвать map_async несколько раз.

Вот пример, иллюстрирующий это,

from multiprocessing import Pool
from time import sleep

def square(x):
    return x * x

def cube(y):
    return y * y * y

pool = Pool(processes=20)

result_squares = pool.map_async(f, range(10))
result_cubes = pool.map_async(g, range(10))

Результат будет:

>>> print result_squares.get(timeout=1)
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

>>> print result_cubes.get(timeout=1)
[0, 1, 8, 27, 64, 125, 216, 343, 512, 729]
4 голосов
/ 24 мая 2017

Они будут , а не работать параллельно.См. Следующий код:

def updater1(q,i):    
    print "UPDATER 1:", i
    return

def updater2(q,i):    
    print "UPDATER2:", i
    return

if __name__=='__main__':
    a = range(10)
    b=["abc","def","ghi","jkl","mno","pqr","vas","dqfq","grea","qfwqa","qwfsa","qdqs"]


    pool = multiprocessing.Pool()

    func1 = partial(updater1,q)
    func2 = partial(updater2,q)
    pool.map_async(func1, a)
    pool.map_async(func2, b)

    pool.close()
    pool.join()

Приведенный выше код дает следующую распечатку:

UPDATER 1: 1
UPDATER 1: 0
UPDATER 1: 2
UPDATER 1: 3
UPDATER 1: 4
UPDATER 1: 5
UPDATER 1: 6
UPDATER 1: 7
UPDATER 1: 8
UPDATER 1: 9
UPDATER2: abc
UPDATER2: def
UPDATER2: ghi
UPDATER2: jkl
UPDATER2: mno
UPDATER2: pqr
UPDATER2: vas
UPDATER2: dqfq
UPDATER2: grea
UPDATER2: qfwqa
UPDATER2: qwfsa
UPDATER2: qdqs
0 голосов
/ 26 ноября 2018

Вы можете использовать map или некоторую лямбда-функцию (редактировать: на самом деле вы не можете использовать лямбда-функцию).Вы можете использовать простую функцию карты:

def smap(f, *args):
    return f(*args)

pool = multiprocessing.Pool(processes=30)
res=pool.map(smap, function_list, args_list1, args_list2,...)

Нормальная функция map принимает в качестве входных данных итерации, что неудобно.

...