我有一个简单的问题要解决(或多或少)
如果我观看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
如果我尝试加入这个过程,它会永远等待。
然而,如果它可以帮助给我答案 - Update--
我注意到这种奇怪的行为只有在从IDLE启动程序时才会出现,如果我从终端运行程序,一切都按预期工作,所以这个问题必须连接到一些IDLE bug。
但是来自终端的runnung程序甚至更奇怪:使用范围(100000000)之类的东西激活我所有计算机的内存,直到程序结束;如果我记得很清楚这不应该发生在python 3中,只有在较旧的python版本中。
我希望这些新信息可以帮助你给出答案
- 更新2--
即使我没有从我的进程执行输出,也会发生错误,因为设置了这个:
def u():
return
作为进程的目标然后启动它,如果我尝试加入进程,则空闲等待
答案 0 :(得分:6)
根据建议here和here,问题是IDLE会以某些奇怪的方式覆盖sys.stdin
和sys.stdout
,这些方式不能完全传播到您从中生成的进程(它们不是真正的文件句柄)。
第一个链接也表明它不太可能很快被修复(“可能是'无法修复'问题”,他们说)。
所以不幸的是,我建议的唯一解决方案是不要将IDLE用于此脚本......
答案 1 :(得分:0)
您是否尝试过向您的计划添加A.join()
?我猜你的主进程在子进程打印之前退出,导致输出被隐藏。如果你告诉主进程等待子进程(A.join()
),我打赌你会看到你期望的输出。
答案 2 :(得分:0)
鉴于它只发生在IDLE上,我怀疑这个问题与两个进程使用的stdout有关。也许它是一些类似文件的对象,从两个不同的进程中使用是不安全的。
如果您没有将子进程写入stdout,我怀疑它将完成并正确加入。例如,您可以将其写入文件。或者您可以在父级和子级之间设置管道。
答案 3 :(得分:0)
您是否尝试过无缓冲输出?尝试导入sys模块并更改print语句:
print >> sys.stderr, m
这对行为有何影响?我和其他人一起怀疑IDLE正在与stdio混淆。 。