2015-07-14 2 views
1

У меня есть рекурсивная функция, определенная в классе. Вся функция выполняет синтаксический анализ текстовых файлов, выполняет некоторые вычисления и сохраняет их в файлах HDF5. Он ничего не возвращает.Python, Multiprocessing: что делать, если process.join() ждет навсегда?

Запуск на одном сердечнике происходит очень медленно. Поэтому я попытался использовать модуль multiprocessing python. Я создаю 4 процесса и вызывая одну и ту же функцию внутри цикла for с разными аргументами.

def main(): 

    f = FileIO() # class which does all the parsing and writing 

    start_node = '2' 
    maxDepth = 6 

    procs = [] 

    start = time.time()  
    print "Entering for loop" 
    for i in xrange(4): 
     p = Process(target = f.read_and_write, args = (node+str(i), maxDepth)) 
     p.start() 
     procs.append(p) 


    print "Exited for loop" 
    for process in procs: 
     process.join() 

    end = time.time() 

    print "Done in ", end - start, "seconds" 

if __name__ == '__main__': 
    main() 

операции чтения и записи выполняются успешно и правильно. Единственная проблема - моя программа не выходит. После печати Entering for loop я ничего не вижу в консоли. От htop Я вижу, что четыре ядра перестали работать. Но моя программа не выходит.

Я не знаю, как подойти к отладке, поскольку я новичок в использовании этого модуля multiprocessing. Мои коды логически правильны и работают отлично, не используя модуль multiprocessing.

  • Как проверить статус процесса?
  • Как узнать, где находится код?

Я использую Python 2.7.10 | Anaconda 2.1.0 (64-bit) | ubuntu 14.04 LTS

Любая помощь по отладке этой проблемы приветствуется.

+1

Что происходит в 'f.read_and_write()'? Вы подтвердили, что выполнение фактически достигает конца этой функции? – dano

+0

Его рекурсивная функция, которая называет себя тысячи раз. Я не знаю, как проверить, действительно ли выполнение достигает конца этой функции. – Sounak

ответ

1

Прежде всего, вы должны убедиться, что процессы будут завершены. Если они перейдут в состояние ожидания, они никогда не будут закончены.

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

+0

Если в функции нет оператора 'return', он возвращает' none' после выполнения задания. Что именно происходит, когда процесс завершен? возвращает ли он что-либо или посылает какой-то сигнал? – Sounak

+0

Когда такой процесс будет завершен, вам нужно вызвать task_done (https://docs.python.org/3/library/multiprocessing.html#multiprocessing.JoinableQueue.task_done) «Если соединение в настоящее время блокируется, оно будет когда все элементы были обработаны (это означает, что для каждого элемента, который был помещен() в очередь, был получен вызов task_done()). " –

+0

Мне показалось, что проблема связана с моей IDE (spyder). Спасибо за помощь. – Sounak

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