2016-12-14 4 views
0

У меня есть основной поток, где я создал ThreadPool. Перед вызовом функции инициализирует каждую нить в пуле. Как ждать, когда все потоки будут инициализированы?wait инициализирован из всех потоков в пуле

Пример:

from multiprocessing.pool import ThreadPool 

def main(): 
    # in main thread 
    pool = ThreadPool(processes=5, initializer=init_pool) 

    # >>> here it is I want to wait for initialized 

    pool.map_async(do_smth).get() 

def init_pool(): 
    # initialized new thread in pool 
    pass 

def do_smth(): 
    # do somethings 
    pass 

Необходимо, чтобы не вызывать map_async если инициализация исключения потоков произошла

+0

я могу использовать значение из многопроцессорных для этой цели, но это не очень подходит – deniska369

ответ

1

Я бы реализовать в вашем do_smth() -функции в barrier и пропустить init_pool. Но это работает только с Python 3.2.

Барьеры имеют предопределенное количество сторон, которые должны называть wait -функцией барьера. Когда барьер регистрирует правильное количество вызовов, он «падает», и вызывающие стороны возвращают туда свою работу одновременно.

Нечто подобное:

from multiprocessing.pool import ThreadPool 
from threading import Barrier 

b = Barrier(parties=5) 

def main(): 
    # in main thread 
    pool = ThreadPool(processes=5) 

    pool.map_async(do_smth).get() 

def do_smth(): 
    #initialize here 
    b.wait() #call to the barrier 
    # do somethings 
    pass 
+0

Круто, спасибо! Несмотря на то, что я пишу в Python 2.7, ваш ответ помог мне! Я могу имитировать барьер, подобный этому http://stackoverflow.com/a/26703365/4181533 – deniska369

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