Когда я использую метод соединения в многопроцессорном модуле?

Я изучаю модуль многопроцессорности. Я нашел эти примеры в документации на python.org:

from multiprocessing import Process

def f(name):
    print('hello', name)

if __name__ == '__main__':
    p = Process(target=f, args=('bob',))
    p.start()
    p.join()

Здесь они используют соединение, чтобы завершить процесс.

from multiprocessing import Process, Lock

def f(l, i):
    l.acquire()
    try:
        print('hello world', i)
    finally:
        l.release()

if __name__ == '__main__':
    lock = Lock()

    for num in range(10):
        Process(target=f, args=(lock, num)).start()

Но в данном случае они его не используют. Я также прочитал это:

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

Это объясняет второй пример. Так почему я должен использовать соединение в первом? Должен ли я это делать, потому что процесс находится в переменной?


person Alceal    schedule 31.01.2015    source источник


Ответы (1)


Вы должны использовать join(), когда хотите дождаться завершения любого подпроцесса, например. если ваша основная программа хочет что-то сделать по результатам работы воркеров. Вы также должны вызывать join(), если ваш основной процесс работает долго и часто создает подпроцесс. В противном случае те, к которым вы не присоединились, будут накапливаться как «зомби-процессы».

В общем, всякий раз, когда поток выполнения вашего основного процесса достигает точки, когда ожидание подпроцессов не повредит, просто делайте это. Это немного похоже на закрытие файла — в этом нет строгой необходимости, так как все файлы будут неявно закрыты при выходе, но это хорошая практика, поскольку она экономит ресурсы.

person Sven Marnach    schedule 31.01.2015