2009-11-17 4 views
3

Когда я использую следующий код, результат пула всегда возвращает таймаут, есть ли что-то логически неправильное, что я делаю?Многопроцессорный пул внутри Время обработки процесса

from multiprocessing import Pool, Process, cpu_count 

def add(num): 
    return num+1 

def add_wrap(num): 
    new_num = ppool.apply_async(add, [num]) 
    print new_num.get(timeout=3) 

ppool = Pool(processes=cpu_count()) 

test = Process(target=add_wrap, args=(5,)).start() 

Я знаю this bug, и подумал бы, что она была бы зафиксирована в питон 2.6.4?

ответ

2

Вы не можете передавать объекты Пула между процессами.

Если вы попробуете этот код, Python вызовет исключение: «NotImplementedError: объекты пула не могут быть переданы между процессами или маринованными».

from multiprocessing import Queue, Pool 

q = Queue() 
ppool = Pool(processes=2)              
q.put([ppool]) 
ppool = q.get() 

Так что если вы хотите, чтобы ваш код работал, просто создайте объект Pool в методе add_wrap.

from multiprocessing import Pool, Process, cpu_count 

def add(num): 
    return num+1 

def add_wrap(num): 
    ppool = Pool(processes=cpu_count()) 
    new_num = ppool.apply_async(add, [num]) 
    print new_num.get(timeout=3) 

test = Process(target=add_wrap, args=(5,)).start() 
+0

Я думал по тем же линиям, но по-прежнему приводит к исключению таймаута. Похоже, что Pool() никогда не должен был вызываться изнутри Process(), хотя я бы подумал, что это была бы выполнимая операция. – NeonNinja

+0

Я не получаю исключение таймаута с python 2.6.4 в Ubuntu Karmic. Какую версию операционной системы/Python вы используете? –

+0

Я плохо тестировал ваше решение с помощью python 2.6, который терпит неудачу, отлично работает на 2.6.4, + принят – NeonNinja

Смежные вопросы