Я не вижу, что именно вы хотите сделать, потому что вы не опубликовали полный фрагмент кода… но я могу сделать что-то приблизительное.
Вам нужно создать функцию, подобную приведенной ниже. А затем используйте параллельную карту. (Я использую библиотеку pathos
вместо multiprocessing
, потому что я автор, ее можно использовать интерактивно из интерпретатора, и она легко принимает несколько аргументов).
>>> import sympy
>>> price = sympy.Symbol('price')
>>> def estate(x, y, z):
... k = 2*price + x
... return z*k**2 + y*k
...
>>> estate(1,2,3)
4*price + 3*(2*price + 1)**2 + 2
>>>
>>> x = range(10)
>>> y = range(-5,5)
>>> z = range(20,0,-2)
>>>
>>> from pathos.pools import ProcessPool
>>> pool = ProcessPool()
>>> pool.map(estate, x, y, z)
[80*price**2 - 10*price, -8*price + 18*(2*price + 1)**2 - 4, -6*price + 16*(2*price + 2)**2 - 6, -4*price + 14*(2*price + 3)**2 - 6, -2*price + 12*(2*price + 4)**2 - 4, 10*(2*price + 5)**2, 2*price + 8*(2*price + 6)**2 + 6, 4*price + 6*(2*price + 7)**2 + 14, 6*price + 4*(2*price + 8)**2 + 24, 8*price + 2*(2*price + 9)**2 + 36]
Или, если вам нужен неблокирующий map
:
>>> res = pool.imap(estate, x, y, z)
>>> res.next()
80*price**2 - 10*price
>>> res.next()
-8*price + 18*(2*price + 1)**2 - 4
>>> res.next()
-6*price + 16*(2*price + 2)**2 - 6
>>> list(res)
[-4*price + 14*(2*price + 3)**2 - 6, -2*price + 12*(2*price + 4)**2 - 4, 10*(2*price + 5)**2, 2*price + 8*(2*price + 6)**2 + 6, 4*price + 6*(2*price + 7)**2 + 14, 6*price + 4*(2*price + 8)**2 + 24, 8*price + 2*(2*price + 9)**2 + 36]
И когда вы закончите, не забудьте закрыть все:
>>> pool.close()
>>> pool.join()
Однако, если вы хотите использовать традиционный multiprocessing
(скажем, у вас есть только один аргумент для вашего map
), это будет выглядеть так:
>>> def doit(x):
... return x+2*x
...
>>> # use the standard multiprocessing interface
>>> import pathos.multiprocessing as mp
>>> pool = mp.Pool()
>>> pool.map(doit, x)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
>>> pool.close()
>>> pool.join()
Также есть пул потоков (то же самое доступно в multiprocessing.dummy
) для использования потоков вместо процессов:
>>> from pathos.pools import ThreadPool
>>> pool = ThreadPool()
>>> pool.map(doit, x)
[0, 3, 6, 9, 12, 15, 18, 21, 24, 27]
>>> pool.close()
>>> pool.join()
Существуют и другие разновидности map
(например, если порядок результатов не имеет значения, используйте uimap
из pathos
, что совпадает с imap_unordered
из multiprocessing
).
person
Mike McKerns
schedule
21.11.2015
multiprocessing
здесь, вероятно, бесполезно, если только вы не запускаете вышеперечисленное несколько раз. Затем вы превратили бы вышеописанное в функцию и вызвали бы ее внутриmap
изmultiprocessing.Pool
. Если у вас есть код, который выполняется в векторном параллельном режиме (например, сnumpy.array
),multiprocessing
обычно будет медленнее. - person Mike McKerns   schedule 21.11.2015