为什么进程不加入而不运行?

时间:2013-03-29 14:51:44

标签: python macos python-3.x parallel-processing multiprocessing

我有一个简单的问题要解决(或多或少)
如果我观看python多处理教程,我发现一个进程应该或多或少地启动:

from multiprocessing import *

def u(m):
    print(m)
    return

A=Process(target=u,args=(0,))
A.start()
A.join()

应打印0但不打印任何内容。相反,它永远挂在A.join()

如果我手动启动你这样做的功能

A.run()

它实际上在shell上打印0但它不能同时工作
例如以下代码的输出:

from multiprocessing import *
from time import sleep

def u(m):
    sleep(1)
    print(m)
    return

A=Process(target=u,args=(1,))
A.start()
print(0)

应该是 0
1

但实际上是
0

如果我在最后一行之前添加

A.run()

然后输出变为
1
0

这似乎让我感到困惑......

如果我尝试加入这个过程,它会永远等待。

然而,如果它可以帮助给我答案
我的操作系统是Mac os x 10.6.8
使用的python版本是3.1和3.3
我的电脑有1个intel核心i3处理器

- Update--
我注意到这种奇怪的行为只有在从IDLE启动程序时才会出现,如果我从终端运行程序,一切都按预期工作,所以这个问题必须连接到一些IDLE bug。 但是来自终端的runnung程序甚至更奇怪:使用范围(100000000)之类的东西激活我所有计算机的内存,直到程序结束;如果我记得很清楚这不应该发生在python 3中,只有在较旧的python版本中。 我希望这些新信息可以帮助你给出答案

- 更新2--
即使我没有从我的进程执行输出,也会发生错误,因为设置了这个:

def u():
    return

作为进程的目标然后启动它,如果我尝试加入进程,则空闲等待

4 个答案:

答案 0 :(得分:6)

根据建议herehere,问题是IDLE会以某些奇怪的方式覆盖sys.stdinsys.stdout,这些方式不能完全传播到您从中生成的进程(它们不是真正的文件句柄)。

第一个链接也表明它不太可能很快被修复(“可能是'无法修复'问题”,他们说)。

所以不幸的是,我建议的唯一解决方案是不要将IDLE用于此脚本......

答案 1 :(得分:0)

您是否尝试过向您的计划添加A.join()?我猜你的主进程在子进程打印之前退出,导致输出被隐藏。如果你告诉主进程等待子进程(A.join()),我打赌你会看到你期望的输出。

答案 2 :(得分:0)

鉴于它只发生在IDLE上,我怀疑这个问题与两个进程使用的stdout有关。也许它是一些类似文件的对象,从两个不同的进程中使用是不安全的。

如果您没有将子进程写入stdout,我怀疑它将完成并正确加入。例如,您可以将其写入文件。或者您可以在父级和子级之间设置管道。

答案 3 :(得分:0)

您是否尝试过无缓冲输出?尝试导入sys模块并更改print语句:

print >> sys.stderr, m

这对行为有何影响?我和其他人一起怀疑IDLE正在与stdio混淆。 。