2011-04-25 73 views
2

我遇到了多處理問題;我在Linux 2.6.36上使用python2.7。我知道使用更高級別的模塊或庫會更容易,但我試圖使用較低級別的函數(os.fork()和os.exec *)來確保我真正理解 - 這是一種學習練習。Python多處理問題/誤解

下面是我的代碼,它是一個多處理'ping'工具。這個問題似乎在運行,它會在os.wait()行上每隔一段時間拋出一個OSError。 「沒有子進程」

這對我沒有意義,因爲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 2011-04-25 21:01:56

+0

您是否查找了「無子進程」錯誤?如果是這樣,請將代碼(和輸出)的大小減小到小而專注。並且包含您找到的「無子進程」錯誤的定義。請**更新**您的問題,以便更容易閱讀而不滾動。 – 2011-04-25 21:03:29

+0

@ThiefMaster在這個系統上的env python是3.1.3-我想要使用python2.7這也是在這個系統上 – tMC 2011-04-25 21:05:33

回答

4

也許你受到bug causing child processes to inherit pending signals的影響。這可以解釋爲什麼堆棧跟蹤出現多次。孩子正試圖等待自己不存在的孩子。

也可以同時處理多個相同類型的排隊信號,所以我不建議在信號處理程序中使用wait()。

+0

如果我在信號處理程序中不使用wait(),我如何收穫一個退出的孩子? – tMC 2011-04-25 22:49:44

+1

處理信號處理程序時設置一個標誌。然後,當您檢測到標誌已設置時,請等待(),直到您收到「無子進程」錯誤並清除該標誌。如果你想阻塞而不是旋轉等待標誌,請檢查signal.set_wakeup_fd,或者你可以通過向信號處理程序中的管道寫入一個字節來進行brew。 – 2011-04-25 22:55:27

+0

我認爲你對這個錯誤是正確的。如果我在收穫函數中測試父對象的pid,它會停止拋出錯誤 'if os.getpid()== ParentPID:os.wait().....' – tMC 2011-04-26 12:52:08

1

您可能會遇到與this SO question中描述的相同的競態條件問題。不幸的是,我現在無法測試你的代碼(Windows環境,所以沒有SIGCHLD),但似乎如果你在問題行12上使用os.waitpid(-1, os.WNOHANG),你不會得到錯誤。不過,您仍然無法保證您不會遇到上述競爭條件。

+0

用os.waitpid替換os.wait()不會清除例外。 :( – tMC 2011-04-25 22:37:19

+0

儘管有'child'列表的值,你可能真的沒有任何子進程,你應該有大部分時間運行7-8個'ping'進程;'ps -a'說什麼?你真的嗎?如果事實證明你不知道,那麼你知道爲什麼'os.wait()'拋出一個錯誤。 – ktdrv 2011-04-25 22:47:06