2011-04-25 74 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