Python: многопроцессорная обработка использует нежелательное значение для использования в функции - PullRequest
0 голосов
/ 28 февраля 2019

Извиняюсь за неоднозначное название, я не уверен, как кратко описать мою проблему.

Для простоты я написал очень короткий тестовый код, который демонстрирует мою проблему.Я пытаюсь использовать многопроцессорную обработку для создания большого набора данных, который будет использоваться с plt.imshow для создания тепловой карты.

Тестовый код выглядит следующим образом (и игнорируйте тот факт, что я использую только пул 1, как я уже сказал, это только для демонстрационных целей):

import numpy as np
import multiprocessing

G_list = [1,2,3]
r = 6

def test(G):
    D = np.cos(G)
    E = r*2
    return G, D, E

pool = multiprocessing.Pool(1)

r_list = []
for i in range(5):
    r += 1
    r_list.append(r)
print r_list

for i in range(len(r_list)):
    r = r_list[i]
    output = pool.map(test,G_list)
    print output

Целью этого кода было вычисление значений D и E для трех значений G в G_list, за исключением того, что я хочу это сделатьэто для диапазона значений для г.Поскольку pool.map () не принимает функцию с несколькими входами, я попытался просто поместить команду pool.map () в цикл for, который изменяется на r.Результат, однако, таков:

[7, 8, 9, 10, 11]
[(1, 0.54030230586813977, 6), (2, -0.41614683654714241, 6), (3, -0.98999249660044542, 6)]
[(1, 0.54030230586813977, 6), (2, -0.41614683654714241, 6), (3, -0.98999249660044542, 6)]
[(1, 0.54030230586813977, 6), (2, -0.41614683654714241, 6), (3, -0.98999249660044542, 6)]
[(1, 0.54030230586813977, 6), (2, -0.41614683654714241, 6), (3, -0.98999249660044542, 6)]
[(1, 0.54030230586813977, 6), (2, -0.41614683654714241, 6), (3, -0.98999249660044542, 6)]

Как вы можете видеть, G изменяется pool.map (), как и ожидалось, но значение r одинаково в каждом цикле, несмотря на то, что оно выполняетсяизменяется с каждым циклом непосредственно перед вызовом pool.map ().Мой вопрос заключается в том, как я могу предотвратить использование pool.map () значения r, глобально определенного в верхней части, и заставить его использовать значение, которое я меняю для каждого цикла?

Python 2.7, большое спасибо!

1 Ответ

0 голосов
/ 01 марта 2019

Поскольку test может принимать только один вход, сделайте вход кортежем.Затем внутри test распакуйте кортеж в отдельные переменные:

def test(task):
    G, r = task

Теперь при вызове pool.map передайте список кортежей в качестве второго аргумента:

tasks = [(G, r) for r in r_list for G in G_list]
output = pool.map(test, tasks)

import numpy as np
import multiprocessing


def test(task):
    G, r = task
    D = np.cos(G)
    E = r*2
    return G, D, E

if __name__ == '__main__':
    pool = multiprocessing.Pool(1)

    G_list = [1,2,3]
    r = 6
    r_list = [r+i for i in range(1, 6)]

    tasks = [(G, r) for r in r_list for G in G_list]
    output = pool.map(test, tasks)
    print(output)

Понимание списка r_list = [r+i for i in range(1, 6)] эквивалентно

r_list = []
for i in range(1, 6):
    r_list.append(r+i)

Аналогично, понимание списка tasks = [(G, r) for r in r_list for G in G_list] эквивалентно

tasks = []
for r in r_list:
    for G in G_list:
        tasks.append((G, r))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...