2011-04-25 2 views
2

У меня проблема с многопроцессорной обработкой; Я использую python2.7 для linux 2.6.36. Я знаю, что это было бы намного проще с модулем или библиотекой более высокого уровня, но я пытаюсь использовать функции нижнего уровня (os.fork() и os.exec *), чтобы я действительно понял. Это своего рода учебное упражнение ,Проблема/непонимание ошибок Python

Ниже мой код, это многопроцессорная утилита «ping». Проблема в том, что, похоже, она запускается, она бросает OSError так часто на строку os.wait(). «Нет дочерних процессов»

Это не имеет смысла для меня, так как os.wait() следует вызывать только тогда, когда программа ловит сигнал о выходе дочернего процесса и нуждается в его извлечении.

Следующий код - образец.

Что я делаю неправильно?

Пример вывода с ошибками ниже -------------------------------------- -

[18188] 
[18188, 18189] 
[18188, 18189, 18190] 
[18188, 18189, 18190, 18191] 
[18188, 18189, 18190, 18191, 18192] 
[18188, 18189, 18190, 18191, 18192, 18193] 
[18188, 18189, 18190, 18191, 18192, 18193, 18194] 
[18188, 18189, 18190, 18191, 18192, 18193, 18194, 18195] 
[18188, 18189, 18191, 18192, 18193, 18194, 18195, 18196] 
[18188, 18191, 18192, 18193, 18194, 18195, 18196, 18197] 
[18188, 18191, 18192, 18194, 18195, 18196, 18197, 18198] 
[18191, 18192, 18194, 18195, 18196, 18197, 18198, 18201] 
[18191, 18194, 18195, 18196, 18197, 18198, 18201, 18202] 
[18191, 18195, 18196, 18197, 18198, 18201, 18202, 18203] 
[18195, 18196, 18197, 18198, 18201, 18202, 18203, 18204] 
[18196, 18197, 18198, 18202, 18203, 18204, 18205] 
[18196, 18197, 18198, 18202, 18203, 18204, 18205, 18206] 
[18197, 18198, 18202, 18203, 18204, 18205, 18206, 18207] 
[18198, 18203, 18204, 18205, 18206, 18207, 18210] 
[18198, 18203, 18204, 18205, 18206, 18207, 18210, 18211] 
Traceback (most recent call last): 
    File "./sunmon-mp", line 33, in <module> 
    pid = os.fork() 
    File "./sunmon-mp", line 12, in chldClean 
    pid, status = os.wait() 
OSError: [Errno 10] No child processes 
[18203, 18204, 18205, 18206, 18207, 18210, 18211, 18212] 
[18203, 18204, 18206, 18207, 18210, 18211, 18212, 18213] 
[18203, 18204, 18206, 18207, 18211, 18212, 18213, 18214] 
[18203, 18204, 18206, 18207, 18211, 18212, 18214, 18215] 
[18203, 18204, 18206, 18207, 18212, 18214, 18215, 18217] 
[18203, 18204, 18206, 18207, 18214, 18215, 18217, 18218] 
[18203, 18204, 18206, 18207, 18215, 18217, 18218, 18219] 
[18204, 18206, 18207, 18215, 18217, 18218, 18219, 18220] 
[18204, 18206, 18207, 18217, 18218, 18219, 18220, 18221] 
[18206, 18207, 18217, 18218, 18219, 18220, 18221, 18223] 
[18207, 18217, 18218, 18219, 18220, 18221, 18223, 18224] 
[18217, 18218, 18219, 18220, 18221, 18223, 18224, 18225] 
[18217, 18219, 18220, 18221, 18223, 18224, 18225, 18226] 
[18217, 18219, 18220, 18221, 18223, 18225, 18226, 18227] 
[18217, 18219, 18220, 18221, 18223, 18226, 18227, 18228] 
[18217, 18220, 18221, 18223, 18226, 18227, 18228, 18229] 
[18217, 18220, 18221, 18223, 18227, 18228, 18229, 18230] 
[18217, 18220, 18221, 18223, 18227, 18228, 18230, 18231] 
[18220, 18221, 18223, 18227, 18228, 18230, 18231, 18233] 
[18221, 18223, 18227, 18228, 18230, 18231, 18233, 18234] 
[18223, 18227, 18228, 18230, 18231, 18233, 18234, 18235] 
[18223, 18227, 18228, 18231, 18233, 18234, 18235, 18236] 
[18223, 18227, 18228, 18231, 18233, 18234, 18236, 18237] 
[18223, 18227, 18228, 18231, 18233, 18234, 18237, 18239] 
[18227, 18228, 18231, 18233, 18234, 18237, 18239, 18240] 
[18228, 18231, 18233, 18234, 18237, 18239, 18240, 18241] 
[18228, 18231, 18233, 18237, 18239, 18240, 18241, 18242] 
[18231, 18233, 18237, 18239, 18240, 18241, 18242, 18243] 
[18231, 18233, 18239, 18240, 18241, 18242, 18243, 18244] 
[18231, 18233, 18239, 18240, 18242, 18243, 18244, 18245] 
[18231, 18233, 18239, 18242, 18243, 18244, 18245, 18246] 
[18231, 18233, 18242, 18243, 18244, 18245, 18246, 18247] 
[18233, 18242, 18243, 18244, 18245, 18246, 18247, 18248] 
[18242, 18243, 18244, 18245, 18246, 18247, 18248, 18249] 
[18243, 18244, 18245, 18246, 18247, 18248, 18249, 18250] 
[18243, 18245, 18246, 18247, 18248, 18249, 18250, 18251] 
[18243, 18245, 18247, 18248, 18249, 18250, 18251, 18252] 
[18243, 18245, 18248, 18249, 18250, 18251, 18252, 18253] 
[18243, 18245, 18249, 18250, 18251, 18252, 18253, 18254] 
[18243, 18245, 18249, 18250, 18252, 18253, 18254, 18255] 
[18245, 18249, 18250, 18252, 18253, 18254, 18255, 18258] 
[18249, 18250, 18252, 18253, 18254, 18255, 18258, 18259] 
[18249, 18250, 18253, 18254, 18255, 18258, 18259, 18260] 
[18249, 18250, 18253, 18254, 18255, 18258, 18260, 18261] 
[18249, 18250, 18253, 18254, 18255, 18260, 18261, 18262] 
[18250, 18253, 18254, 18255, 18260, 18261, 18262, 18263] 
[18253, 18254, 18255, 18260, 18261, 18262, 18263, 18264] 
[18253, 18254, 18255, 18261, 18262, 18263, 18264, 18265] 
[18253, 18254, 18255, 18261, 18262, 18264, 18265, 18266] 
[18254, 18255, 18261, 18262, 18264, 18265, 18266, 18267] 
[18255, 18261, 18262, 18264, 18265, 18266, 18267, 18268] 
[18261, 18262, 18264, 18265, 18266, 18267, 18268, 18269] 
[18261, 18262, 18265, 18266, 18267, 18268, 18269, 18270] 
[18261, 18262, 18265, 18266, 18267, 18268, 18270, 18271] 
[18261, 18262, 18265, 18266, 18267, 18270, 18271, 18273] 
[18261, 18262, 18265, 18266, 18270, 18271, 18273, 18274] 
[18261, 18262, 18265, 18266, 18271, 18273, 18274, 18275] 
[18261, 18262, 18265, 18266, 18271, 18273, 18275, 18276] 
[18262, 18265, 18266, 18271, 18273, 18275, 18276, 18277] 
[18262, 18265, 18266, 18273, 18275, 18276, 18277, 18278] 
[18265, 18266, 18273, 18276, 18277, 18278, 18280] 
[18265, 18266, 18273, 18276, 18277, 18278, 18280, 18281] 
Traceback (most recent call last): 
    File "./sunmon-mp", line 33, in <module> 
    pid = os.fork() 
    File "./sunmon-mp", line 12, in chldClean 
    pid, status = os.wait() 
OSError: [Errno 10] No child processes 
[18265, 18273, 18276, 18277, 18278, 18280, 18282] 
[18265, 18276, 18277, 18278, 18280, 18281, 18282, 18283] 
[18265, 18276, 18278, 18281, 18282, 18283, 18284] 
[18265, 18276, 18278, 18281, 18282, 18283, 18284, 18285] 
[18265, 18276, 18278, 18282, 18283, 18284, 18285, 18286] 
[18265, 18276, 18278, 18283, 18284, 18286, 18289] 
[18265, 18276, 18278, 18283, 18284, 18286, 18289, 18290] 
Traceback (most recent call last): 
    File "./sunmon-mp", line 33, in <module> 
    pid = os.fork() 
    File "./sunmon-mp", line 12, in chldClean 
    pid, status = os.wait() 
OSError: [Errno 10] No child processes 
[18265, 18276, 18278, 18283, 18284, 18289, 18290, 18291] 
[18276, 18278, 18283, 18284, 18289, 18290, 18291, 18292] 
[18276, 18278, 18283, 18284, 18290, 18291, 18292, 18293] 
[18276, 18278, 18283, 18284, 18290, 18291, 18293, 18294] 
[18276, 18278, 18283, 18284, 18290, 18291, 18294, 18295] 
[18278, 18283, 18284, 18290, 18291, 18294, 18295, 18297] 
[18283, 18284, 18290, 18291, 18294, 18295, 18297, 18298] 
[18283, 18284, 18290, 18291, 18295, 18297, 18298, 18299] 
+0

Вы должны использовать '#!/Usr/bin/env python' вместо' #!/Usr/bin/python2.7' – ThiefMaster

+0

Вы просмотрели ошибку «Нет дочерних процессов»? Если да, уменьшите размер своего кода (и вывода) на что-то маленькое и сосредоточенное. И включите определение, которое вы обнаружили в ошибке «Нет дочерних процессов». Пожалуйста, ** уточните ** ваш вопрос, чтобы его было легче читать без прокрутки. –

+0

@ThiefMaster env python в этой системе 3.1.3- я хочу использовать python2.7, который также находится в этой системе – tMC

ответ

4

Возможно, на вас воздействует bug causing child processes to inherit pending signals. Это объясняет, почему трассировка стека появляется более одного раза. Ребенок пытается подождать сам по себе несуществующий ребенок.

Также может быть обработано сразу несколько однофазных сигналов одного типа, поэтому я не рекомендую использовать wait() в обработчике сигналов.

+0

Если я не использую wait() в обработчике сигнала, как я могу извлечь дочерний элемент? – tMC

+1

Установите флаг в обработчик сигнала, когда он обрабатывается.Затем, когда вы обнаружите, что установлен флаг, подождите(), пока не получите ошибку «Нет дочерних процессов» и очистите флаг. Если вы хотите заблокировать вместо ожидания ожидания на флаге, проверьте signal.set_wakeup_fd, или вы можете начать варить, записав байт в трубу в обработчике сигналов. –

+0

Я думаю, вы правы в этой ошибке. Если я тестирую pid против родителя в функции reaping, он прекращает метать ошибки 'if os.getpid() == ParentPID: os.wait() .....' – tMC

1

У вас может быть такая же проблема с состоянием гонки, которая описана в this SO question. К сожалению, я не могу проверить ваш код прямо сейчас (среда Windows, так что нет SIGCHLD), но кажется, что если вы используете os.waitpid(-1, os.WNOHANG) на проблемной линии 12, вы не получите ошибку. Вы по-прежнему не получаете никакой гарантии, что вы не столкнетесь с описанным выше условием гонки.

+0

, заменяя os.wait() на os.waitpid, не проясняется исключения. :( – tMC

+0

Возможно, у вас действительно нет дочерних процессов, несмотря на ценность списка 'kids'. У вас должно быть 7-8' ping' процессов, выполняемых большую часть времени, что говорит 'ps -a'? вы действительно? Если это не так, то вы знаете, почему 'os.wait()' выдает ошибку. – ktdrv

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