2016-04-14 4 views
0

я могу использовать мультипроцессирование легко настроить параллельные вызовы на «Func», как это:питон многопроцессорных используя несколько аргументов

import multiprocessing 

def func(tup): 
    (a, b) = tup 
    return str(a+b) 

pool = multiprocessing.Pool() 
tups = [ (1,2), (3,4), (5,6), (7,8)] 
results = pool.imap(func, tups) 
print ", ".join(results) 

Давать результат:

3, 7, 11, 15 

Проблема заключается в том, что моя фактическая функция " func "сложнее, чем пример здесь, поэтому я не хочу называть его одним аргументом« tup ». Я хочу несколько аргументов , а также аргументы ключевых слов . То, что я хочу сделать что-то вроде ниже, но «*» распаковки внутри списка не работает (и не поддерживают ключевые слова либо) :

import multiprocessing 

def func(a, b): 
    return str(a+b) 

pool = multiprocessing.Pool() 
tups = [ *(1,2), *(3,4), *(5,6), *(7,8)] 
results = pool.imap(func, tups) 
print ", ".join(results) 

Итак ... есть ли способ чтобы получить всю мощь вызовов функций python при параллельной обработке?

+0

Следует помнить, что '(i) map' будет пытаться распределять ваши аргументы равномерно. Таким образом, любой список a должен соответствовать любому списку b. В этом случае список кортежей, который вы делаете сейчас, может быть лучшим способом. – Evert

+0

Не могли бы вы дать более ясный пример того, что эти другие аргументы, включая аргументы ключевого слова, являются? – Evert

+0

Во-вторых, я думаю, что могу жить без аргументов ключевого слова. По крайней мере, на данный момент, я хочу, чтобы возможность передавать несколько параметров для функции func, без «func», чтобы сделать немного грязную работу по распаковке кортежа. Я знаю, что это не очень важно, но я покажу код для людей, не являющихся питонами, поэтому любое упрощение помогает. –

ответ

0

Не можете ли вы использовать дикты или объекты?

import multiprocessing 
def func(a): 
    print(str(a['left'] + a['right'])) 

pool = multiprocessing.Pool() 
i1 = {'left': 2, 'right': 5} 
i2 = {'left': 3, 'right': 4} 
pool.imap(func, [i1, i2]) 

Таким образом, вы не будете иметь ключевые слова, определенные в определении метода, но вы, по крайней мере, иметь возможность ссылаться на ключевые слова в теле метода. То же самое касается ввода функции. Вместо того, чтобы иметь дело с кортежем, это более читаемо.

+0

Спасибо за это - хорошая точка. Я потерял большую часть дня из-за ошибки в моем коде, упаковывая/распаковывая кортежи. Итак, теперь я передаю объект «func», который почти так же хорош, как и я. –

0

комментарий HarryPotfleur является правильным, в основном, если вы используете Python 3.3+, можно использовать starmap:

Starmap (FUNC, итерацию [, chunksize])
Как map() исключением того, что в ожидается, что элементы итерабельности будут итерабельными, которые являются распакованными как аргументы.

Следовательно, итерабельность [(1,2), (3, 4)] приводит к [func(1,2), func(3,4)].

Просто замените imap на starmap.

Если вы используете более низкую версию, нет прямого способа сделать это. Вместо этого вы можете использовать промежуточную функцию

def inter(tup): 
    return func(*tup) 

def func(a, b, c): 
    return str(a+b+c) 
Смежные вопросы