Привет StackOverflow пользователей,многопроцессорных функции с постоянными и Iterable аргументов
Я попытался посмотреть это вверх, но не смог найти ответ: Я в основном хотел бы обработать функцию параллельно (независимые процессы!) И функцию имеет один итеративный (x
) и несколько постоянных аргументов (k
, d
). Вот очень упрощенный пример:
from multiprocessing import *
def test_function(args):
k = args[0]
d = args[1]
x = args[2]
del args
return k*x + d
if __name__ == '__main__':
pool = Pool(processes=2)
k = 3.
d = 5.
constants = [k,d]
xvalues = range(0,10)
result = [pool.apply_async(test_function, constants.append(i)) for i in xvalues]
output = [r.get() for r in result]
print output
#I expect [5.0, 8.0, 11.0, 14.0, 17.0, 20.0, 23.0, 26.0, 29.0, 32.0]
Это дает мне следующее сообщение об ошибке:
Traceback (most recent call last):
File "test_function.py", line 23, in <module>
output = [r.get() for r in result]
File "C:\Program Files\Python2.7\lib\multiprocessing\pool.py", line 528, in get
raise self._value
TypeError: test_function() argument after * must be a sequence, not NoneType
Так что мои вопросы:
Что это сообщение об ошибке на самом деле означает?
Как исправить это, чтобы получить ожидаемые результаты (см. Последнюю строку примера кода)?
Есть ли лучший/рабочий/элегантный способ для линии, которая вызывает apply_sync?
FYI: Я новичок здесь и на python, пожалуйста, несите меня и дайте мне знать, если мой пост нуждается в подробностях.
Большое спасибо за любые предложения!
В любом случае ему лучше будет обслуживать 'pool.map' или' pool.map_asynch'. –
Спасибо за отличный ответ и Сайласу за дополнение! Я включил все предложения, но мне пришлось изменить строку pool.map следующим образом: 'result = pool.map (test_function, [константы + [i] для i в xvalues])' А также последующая строка с '.get () 'на самом деле лишний, печать' result' дает правильный ответ.Спасибо также за общие предложения. – ilun