2014-12-29 1 views
2

Иногда мне нужно использовать многопроцессорность с функциями без аргументов. Я хотел бы сделать что-то вроде:Могу ли я использовать map/imap/imap_unordered с функциями без аргументов?

from multiprocessing import Pool 

def f(): # no argument 
    return 1 

# TypeError: f() takes no arguments (1 given) 
print Pool(2).map(f, range(10)) 

я мог сделать Process(target=f, args=()), но я предпочитаю синтаксис map/imap/imap_unordered. Есть ли способ сделать это?

+0

Вы хотели бы переопределить 'f', чтобы принять один аргумент и проигнорировать его? – inspectorG4dget

+1

@ inspectorG4dget: нет, я бы предпочел избежать этого –

+1

У меня такое ощущение, что это проблема [XY] (http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem). Итак, давайте сделаем шаг назад: что вы на самом деле пытаетесь сделать, для чего вы пытаетесь использовать эту функцию? – inspectorG4dget

ответ

3

map Первый аргумент функции должен быть функцией, и он должен принимать один аргумент. Это обязательно, потому что итерабель, переданный как второй аргумент, будет итерирован, и значения будут переданы функции по одному на каждой итерации.

Итак, ваш лучший выбор, чтобы переопределить f принять один аргумент и игнорировать его, или написать функцию обертку с одним аргументом, игнорировать аргумент и возвращает значение, возвращаемое f, как это

from multiprocessing import Pool 

def f(): # no argument 
    return 1 

def throw_away_function(_): 
    return f() 

print(Pool(2).map(throw_away_function, range(10))) 
# [1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 

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

0

Есть ли что-то неправильное с использованием Pool.apply_async?

with multiprocessing.Pool() as pool: 
    future_results = [pool.apply_async(f) for i in range(n)] 
    results = [f.get() for f in future_results] 
+0

Это вызывает ошибку (Python 2.7): с multiprocessing.Pool() как пул: AttributeError: __exit__ – postoronnim