IPython和fork()

7

我计划编写一个Python脚本,使用os.fork()创建一堆子进程来执行一些计算。父进程将会被阻塞,直到子进程终止。

问题在于,我需要能够在Unix shell中使用python和在ipython中使用%run运行该脚本。

为了避免回到ipython命令提示符,子进程应该以何种方式终止?根据我的经验,sys.exit()做不到这点。


4
使用 subprocess 模块会比使用 os.fork 更容易吗? - Thomas K
@Thomas K:建议不错,但是我正在考虑的解决方案对于RAM使用和性能原因至关重要依赖于os.fork() - NPE
@ahmet alp balkan:我希望子进程终止,而不是回到“ipython” shell。如果您不确定我在说什么,请尝试一下。 - NPE
该死,我以为那是IronPython。我的错,抱歉。 - ahmet alp balkan
如果子进程在不调用sys.exit()的情况下到达脚本结尾会发生什么? - Russell Borogove
显示剩余4条评论
2个回答

9
以下似乎可以正常工作:
import os, sys

child_pid = os.fork()
if child_pid == 0:
  print 'in child'
  os._exit(os.EX_OK)
  print 'hm... wasn''t supposed to get here'
else:
  print 'in parent'

使用 os._exit() 而不是 sys.exit()。文档包含以下内容:

注意 退出的标准方式是 sys.exit(n)。在 fork() 后通常只应该在子进程中使用 _exit()


0
在Linux术语中,为什么不在iPython shell中exec一个常规的Python解释器并让它分叉,而不是fork iPython进程呢?

我有大量的内存数据结构,需要从交互式的ipython shell和脚本(包括父进程和子进程)中访问。因此,需要在ipython中使用fork - NPE
1
使用共享内存怎么样?我从未尝试过POSH(Python对象共享),但我听说它很神奇。然后你可以按照任何喜欢的方式构建你的进程。 - salezica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接