【发布时间】:2013-03-20 07:09:26
【问题描述】:
我有一个简单的问题要解决(或多或少)
如果我观看 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 个英特尔酷睿 i3 处理器
--更新--
我注意到这种奇怪的行为只有在从 IDLE 启动程序时才会出现,如果我从终端运行程序,一切都按预期工作,所以这个问题必须与一些 IDLE 错误有关。
但是从终端运行程序更奇怪:使用 range(100000000) 之类的东西会激活我所有计算机的内存,直到程序结束;如果我记得很清楚,这不应该发生在 python 3 中,只发生在较旧的 python 版本中。
我希望这些新信息能帮助您给出答案
--更新 2--
即使我不从我的进程执行输出,也会出现错误,因为设置了这个:
def u():
return
作为进程的目标然后启动它,如果我尝试加入进程,空闲等待永远
【问题讨论】:
-
我不能告诉你为什么,这就是为什么我没有发布这个作为答案,但是创建进程的所有示例在目标中都没有
return语句(这与Pool目标)。您是否尝试过从u中删除 return 语句? -
@sr2222 不。
return等同于return None。模控制流(在 OP 的示例中不是问题),根本没有return与返回None相同。 -
你的两个例子在我安装的所有 python 版本上都给了我在 linux 上的预期结果。
-
@delnan,是的,我知道对于正常情况,但我不确定是否在 C 扩展的内部
_multiprocess、select或fcntl库中,有一些细微的差别,它被暴露在这里。 -
你认为赏金可以帮助我找到答案吗?
标签: python macos python-3.x parallel-processing multiprocessing