Python2: многопроцессорная обработка с использованием пула рабочих с несколькими аргументами - PullRequest
0 голосов
/ 24 августа 2018

Я хочу попробовать параллельные вычисления в python-2.x, используя multiprocessing.Pool.

Я придумал следующий простой код.К сожалению, я не смог выдать любое сообщение об ошибке.

Может ли кто-нибудь указать мне правильное направление, что может быть не так с моим кодом?

import numpy as np
import multiprocessing as mp
import timeit

def fun(i,j):
    return i+j

num=2

num_cores = mp.cpu_count()
p = mp.Pool(num_cores)

results = np.array([])
tasks = np.array([(i, j) for i in range(0,num) for j in range(0, num)])

if __name__ == '__main__':
    results = np.array(p.map(fun,tasks))
    print results

1 Ответ

0 голосов
/ 24 августа 2018

Основная проблема, с которой вы здесь сталкиваетесь, заключается в том, что кортежи, которые вы хотите передать в качестве аргументов рабочим, заключены в numpy.ndarray и, таким образом, это просто один аргумент как numpy.ndarray не разворачивается.


Это должно работать для вас:

from __future__ import print_function
import numpy as np
import multiprocessing as mp
import timeit

def fun(ij):
    s = sum(ij)
    print('{0} + {1} = {2}'.format(ij[0], ij[1], s))
    return s

num=2

num_cores = mp.cpu_count()
p = mp.Pool(num_cores)

results = np.array([])
tasks = np.array([(i, j) for i in range(0,num) for j in range(0, num)])

if __name__ == '__main__':
    results = np.array(p.map(fun,tasks))
    print(results)

Вывод этого скрипта:

0 + 0 = 0
0 + 1 = 1
1 + 0 = 1
1 + 1 = 2
[0 1 1 2]

Я добавил оператор from __future__ import print_function, смотрите здесь для чего он хорош. И здесь соответствует PEP 3105 - сделать печать функцией .


Заключительные замечания: более подробное решение можно найти здесь от пользователя senderle.

...