В многопроцессорной библиотеке Python есть вариант pool.map, который поддерживает несколько аргументов?
text = "test"
def harvester(text, case):
X = case[0]
text+ str(X)
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=6)
case = RAW_DATASET
pool.map(harvester(text,case),case, 1)
pool.close()
pool.join()
python
multiprocessing
user642897
источник
источник
partial
ниlambda
сделать это. Я думаю, что это связано со странным способом, которым функции передаются подпроцессам (черезpickle
).pool.map(harvester(text,case),case, 1)
на:pool.apply_async(harvester(text,case),case, 1)
return
кharvester()
тому, что ответ @senderie оказался неточным. Это не поможет будущим читателям.Ответы:
Ответ на это зависит от версии и ситуации. Наиболее общий ответ для последних версий Python (начиная с версии 3.3) был впервые описан JF Sebastian . 1 Используется
Pool.starmap
метод, который принимает последовательность кортежей аргументов. Затем он автоматически распаковывает аргументы из каждого кортежа и передает их данной функции:Для более ранних версий Python вам нужно написать вспомогательную функцию для явной распаковки аргументов. Если вы хотите использовать
with
, вам также нужно написать оболочку, чтобы превратитьсяPool
в менеджер контекста. (Спасибо Мюону за указание на это.)В более простых случаях вы можете использовать фиксированный второй аргумент
partial
, но только в Python 2.7+.1. Во многом это было вдохновлено его ответом, который, вероятно, следовало бы принять вместо этого. Но так как этот вариант застрял на вершине, лучше всего его улучшить для будущих читателей.
источник
=RAW_DATASET
значение по умолчаниюcase
. В противном случаеpool.map
будет путать насчет нескольких аргументов.text
переменной в вашем примере? Почему,RAW_DATASET
казалось бы, прошло два раза. Я думаю, что у вас может быть опечатка?with .. as ..
дает мнеAttributeError: __exit__
, но работает хорошо, если я просто позвонить, аpool = Pool();
затем закрыть вручнуюpool.close()
(python2.7)Pool
объекты не становятся менеджерами контекста до Python 3.3. Я добавил простую функцию-обертку, которая возвращаетPool
менеджер контекста.Python 3.3 включает в себя
pool.starmap()
метод :Для более старых версий:
Вывод
Обратите внимание, как
itertools.izip()
иitertools.repeat()
здесь используются.Из- за ошибки, упомянутой @unutbu, вы не можете использовать
functools.partial()
или подобные возможности в Python 2.6, поэтому простая функция-оберткаfunc_star()
должна быть определена явно. Смотрите также обходной путь, предложенныйuptimebox
.источник
func_star
как это:def func_star((a, b))
. Конечно, это работает только для фиксированного числа аргументов, но если это единственный случай, который он имеет, он более читабелен.f((a,b))
синтаксис устарел и удален в py3k. И это не нужно здесь.func = lambda x: func(*x)
вместо определения функции-оболочкиfunc_star()
описанному выше)starstarmap
.Думаю ниже будет лучше
вывод
источник
args
напрямуюadd
, она работает для любого количества аргументов:def add(args): (x,y) = args
lambda
функцию вместо определенияmulti_run_wrapper(..)
lambda
не работает, потому чтоpool.map(..)
пытается засолить данную функциюadd
в списке?Использование Python 3.3+ с
pool.starmap():
Результат:
Вы также можете zip () больше аргументов, если вам нравится:
zip(a,b,c,d,e)
В случае, если вы хотите, чтобы в качестве аргумента передавалось постоянное значение,
import itertools
а затем,zip(itertools.repeat(constant), a)
например.источник
Узнав об itertools в ответе Дж.Ф. Себастьяна, я решил сделать еще один шаг и написать
parmap
пакет, который заботится о распараллеливании, предложенииmap
иstarmap
функциях на python-2.7 и python-3.2 (и позже), которые могут принимать любое количество позиционных аргументов. ,Установка
Как распараллелить:
Я загрузил parmap в PyPI и в хранилище github .
В качестве примера на вопрос можно ответить следующим образом:
источник
# «Как принять несколько аргументов».
источник
Есть форк с
multiprocessing
названием pathos ( примечание: используйте версию на github ), который не нуженstarmap
- функции карты отражают API для карты python, поэтому map может принимать несколько аргументов. С помощьюpathos
вы также можете выполнять многопроцессорную обработку в интерпретаторе вместо того, чтобы застрять в__main__
блоке. После небольшого обновления Pathos выйдет в свет - в основном это переход на python 3.x.pathos
Есть несколько способов, которыми вы можете получить точное поведениеstarmap
.источник
Вы можете использовать следующие две функции, чтобы избежать написания оболочки для каждой новой функции:
Используйте функцию
function
со списками аргументовarg_0
,arg_1
иarg_2
выглядит следующим образом :источник
Лучшее решение для python2:
2 3 4
1 2 3
0 1 2
вне[]:
[3, 5, 7]
источник
Другой простой альтернативой является упаковка параметров вашей функции в кортеж, а затем упаковка параметров, которые также должны быть переданы в кортежи. Это, возможно, не идеально, когда имеешь дело с большими кусками данных. Я считаю, что это будет делать копии для каждого кортежа.
Дает вывод в некотором случайном порядке:
источник
Лучше использовать декоратор вместо написания функции-оболочки вручную. Особенно, когда у вас есть много функций для отображения, декоратор сэкономит ваше время, избегая написания оболочки для каждой функции. Обычно декорированная функция не является кражей, однако мы можем использовать ее
functools
для обхода. Больше рассуждений можно найти здесь .Вот пример
Тогда вы можете сопоставить его с заархивированными аргументами
Конечно, вы всегда можете использовать
Pool.starmap
в Python 3 (> = 3.3), как указано в других ответах.источник
itertools.product
вместоzip
.Другой способ - передать список списков подпрограмме с одним аргументом:
Можно создать список списков аргументов с помощью любимого метода.
источник
Вот еще один способ сделать это, что ИМХО является более простым и элегантным, чем любой из предоставленных ответов.
Эта программа имеет функцию, которая принимает два параметра, печатает их, а также печатает сумму:
вывод:
Смотрите документацию по Python для получения дополнительной информации:
https://docs.python.org/3/library/multiprocessing.html#module-multiprocessing.pool
В частности, обязательно ознакомьтесь с
starmap
функцию.Я использую Python 3.6, я не уверен, будет ли это работать со старыми версиями Python
Почему в документах нет такого простого примера, как я, я не уверен.
источник
В python 3.4.4 вы можете использовать multiprocessing.get_context (), чтобы получить объект контекста для использования нескольких методов запуска:
Или вы просто замените
по:
источник
Здесь много ответов, но ни один из них не предоставляет Python 2/3-совместимый код, который будет работать на любой версии. Если вы хотите, чтобы ваш код просто работал , это будет работать для любой версии Python:
После этого вы можете использовать многопроцессорную обработку обычным способом Python 3, как вам нравится. Например:
будет работать в Python 2 или Python 3.
источник
В официальной документации говорится, что она поддерживает только один итеративный аргумент. Мне нравится использовать apply_async в таких случаях. В вашем случае я бы сделал:
источник
источник
Это пример процедуры, которую я использую для передачи нескольких аргументов в функцию с одним аргументом, используемую в форке pool.imap :
источник
для python2 вы можете использовать этот трюк
источник