Python 为什么流程没有';不加入并不';我跑不了?

Python 为什么流程没有';不加入并不';我跑不了?,python,macos,python-3.x,parallel-processing,multiprocessing,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()上 如果我手动启动函数u执行此操作 A.run() 它实际上在外壳上打印0,但不能同

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

from multiprocessing import *

def u(m):
    print(m)
    return

A=Process(target=u,args=(0,))
A.start()
A.join()
它应该打印0,但不会打印任何内容。相反,它将永远挂在
A.join()

如果我手动启动函数u执行此操作

A.run()
它实际上在外壳上打印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
一,

但实际上是
0

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

A.run()
然后输出变为
1
0

这让我很困惑

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

但是,如果它能帮助我回答问题
我的操作系统是Mac OS x 10.6.8
使用的python版本是3.1和3.3
我的电脑有一个intel core i3处理器

--更新--
我注意到,只有在从空闲状态启动程序时才会出现这种奇怪的行为,如果我从终端运行程序,一切都会正常工作,因此这个问题一定与一些空闲错误有关。
但从终端运行程序更为奇怪:使用range(100000000)之类的东西激活我电脑的所有ram,直到程序结束;如果我记得清楚的话,这不应该发生在Python3中,只有在较旧的python版本中。 我希望这些新信息能帮助你给出答案

--更新2--
即使我不执行流程的输出,也会发生错误,因为设置此选项:

def u():
    return

作为进程的目标,然后启动它,如果我尝试加入进程,idle将永远等待

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

鉴于这只发生在空闲时,我怀疑问题与两个进程使用的标准输出有关。可能是某个类似文件的对象在两个不同的进程中使用不安全

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

正如建议的那样,问题是空闲重写
sys.stdin
sys.stdout
,它们以一些奇怪的方式无法干净地传播到您从中生成的进程(它们不是真正的文件句柄)

第一个链接还表明它不太可能很快得到修复(“可能是‘无法修复’的问题”,他们说)


因此,不幸的是,我能建议的唯一解决方案是不要对此脚本使用IDLE…

您尝试过无缓冲输出吗?尝试导入sys模块并更改打印语句:

print >> sys.stderr, m

这对行为有何影响?我和其他人一起怀疑IDLE在捣乱stdio

我无法告诉您原因,这就是为什么我没有将此作为答案发布,但所有创建流程的示例在目标中都没有
return
语句(这与
Pool
targets不同)。是否尝试从
u
中删除return语句?@sr2222否。
return
相当于
return None
。模控制流(在OP的示例中不是一个问题),完全没有
return
与返回
None
是一样的。您的两个示例都给了我在linux上安装的所有python版本上的预期结果。@delnan,是的,我知道在正常情况下,但是我不确定在C扩展
\u多进程
选择
,或
fcntl
库的内部是否存在一些细微的差异,它在这里被公开了。你认为赏金能帮我找到答案吗?不,如果我尝试一个.join()python解释器,它将永远等待,子进程没有像我在问题中说的那样运行抱歉,我读了代码,没有意识到这就是你在标题中的意思。我对问题本身进行了编辑,以包含对A.join的调用。即使我给我的孩子一个任务,比如做一些算术,不使用输入或输出,也不写入文件,taskmanager告诉我,我的cpu只有一个核心在使用,这不是一个合理的测试。除非该核心的利用率达到或接近100%,否则没有理由仅仅因为有另一个过程就使用另一个核心。问题是:子进程是否成功完成,父进程的加入请求是否成功?