2015-02-05 4 views
0
import time 
import multiprocessing 

def multi_thread(files): 
    q = multiprocessing.Queue() 

    for f in files: 
     q.put(f) 

    p = multiprocessing.Pool(5) 

    for i in range(5): 
     p.apply_async(worker_test, args=(q,)) 

    p.close() 
    p.join() 


def worker_test(i): 
    print 'hello' 
    print i 


def main(): 
    files = ['a', 'b', 'c', 'd'] 

    multi_thread(files[0:4]) 
    print 'Multi-thread time: {0} seconds'.format(time.time() - t0) 

if __name__ == '__main__': 
    main() 

Моим код даже не входит в функцию work_test() для печати hello если я прохожу в q. Но если я изменю q на i, код будет работать нормально. Как-то это не нравится объекту multiprocessing.Queue() - любые идеи, что происходит?многопроцессорной apply_async странного поведения с очередью многопроцессорной

+1

См [этот вопрос] (http://stackoverflow.com/questions/3827065) –

ответ

1

Вам необходимо создать экземпляр очереди, который может быть разделен между различными процессами. Вы можете сделать это, используя объект multiprocessing.Manager.

Следующий код, кажется, работает:

import time 
import multiprocessing 

def multi_thread(files): 
    m = multiprocessing.Manager() 
    q = m.Queue() 

    for f in files: 
     q.put(f) 

    p = multiprocessing.Pool(5) 
    for i in range(5): 
     p.apply_async(worker_test, args=(i, q)) 

    p.close() 
    p.join() 

def worker_test(i, q): 
    print 'hello' 
    print i 

def main(): 
    files = ['a', 'b', 'c', 'd'] 

    multi_thread(files[0:4]) 

if __name__ == '__main__': 
    main() 
+0

Спасибо за ответ, который работает. Тем не менее, моя «очередь» работает нормально, хотя если я начинаю каждый «процесс» вручную, а не используя «пул». Почему так, что только с пулом мне нужно использовать 'multiprocessing.Manager'? – mchangun

+1

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

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