2016-12-14 5 views
0

Я распараллеливание мой Python 2.7 сценария с помощью модуля многопроцессорной так:Python 2.7: Multiprocessing, очереди и присоединиться

from multiprocessing import Queue, Process 

def func(input_queue, result_queue): 
    my_object = input_queue.get() 
    # do something 
    result_queue.put([my_object, 0]) 
    print "finished" 


procs = [] 
chuncks = 4 
input_queue = Queue() 
result_queue = Queue() 
j = len(my_objects)/chuncks 

for i in range(chuncks): 
    input_queue.put(list(my_objects[(i*j):(i+1)*j]])) 

for i in range(chuncks): 
    proc = Process(target=func, args=(input_queue, result_queue)) 
    procs.append(proc) 
    proc.start() 
    print proc.pid 

for proc in procs: 
    proc.join() 

while not result_queue.empty(): 
    print result_queue.get() 

my_object является экземпляром класса my_class написанного мной.

Моя проблема: В зависимости от реализации my_class мой код работает или нет. Если я определяю my_class просто следующим образом:

class my_class(object): 

    def __init__(self): 
     print "bla" 

все в порядке. Но «на самом деле», my_class более сложный (имеет несколько атрибутов). Выполнение приведенного выше кода с реальным осуществлением my_class приводит к следующему выходу:

1545 
1546 
1547 
1548 
finished 
finished 
finished 
finished 

Затем он заклинивание во время ожидания proc.join(). Что я делаю не так?

+0

Что вы желаемый результат? – AndyW

+0

Можете ли вы попытаться дать нам наименьшую возможную программу, которая демонстрирует проблему? –

+0

В этом примере вывод должен быть содержимым «result_queue» (на самом деле моя функция func более сложна, чем в моей публикации здесь: я использую атрибуты my_object для некоторых вычислений и передаю my_object и результат вычисления (вместо 0) - result_queue.) – Christine

ответ

0

пытаются использовать различные очереди

m = multiprocessing.Manager() 
queue1 = m.Queue()