多处理或os.fork,os.exec?

时间:2013-02-05 07:03:42

标签: python

我正在使用多处理模块来分叉子进程。因为在分叉时,子进程获取父进程的地址空间,我得到父进程和子进程的相同记录器。我想清除父进程中携带的任何值的子进程的地址空间。我知道多处理在较低级别执行fork()而不执行exec()。我想知道在我的情况下使用多处理是否合适,还是应该使用os.fork()和os.exec()组合,还是有其他解决方案?

感谢。

2 个答案:

答案 0 :(得分:8)

由于multiprocessing正在运行程序中的函数,就像它是一个线程函数一样,它肯定需要一个完整的进程状态副本。这意味着要做fork()

使用multiprocessing提供的更高级别界面通常会更好。至少你自己不应该关心fork()返回代码。

os.fork()是一个较低级别的功能,提供更少的服务开箱即用,但你当然可以将它用于任何multiprocessing用于...的部分重新实现的代价multiprocessing代码。所以,我认为,multiprocessing对你来说应该没问题。

但是,如果您处理'内存占用太大而无法复制它(或者如果您有其他理由避免分叉 - 打开与数据库的连接,打开日志文件等),您可能必须进行所需的功能在新进程中运行一个单独的python程序。然后,您可以使用subprocess运行它,将参数传递给stdin,捕获其stdout并解析输出以获得结果。

UPD: os.exec... family of functions很难用于大多数用途,因为它会将您的进程替换为生成的进程(如果您运行的程序与运行相同,它将从一开始就重新启动,而不是保留任何内存数据)。但是,如果您确实不需要继续执行父进程,exec()可能会有所帮助。

根据我的个人经验:os.fork()经常用于在Unix上创建守护进程;我经常使用subprocess(通过stdin / stdout进行通信);几乎从未使用过多处理;我生命中没有一次需要os.exec...()

答案 1 :(得分:2)

您可以将子进程中的记录器重新绑定到自己的进程。我不了解其他操作系统,但在Linux上,分叉不会复制整个内存占用(正如Ellioh所提到的),但使用" copy-on-write"概念。因此,在您更改子进程中的某些内容之前 - 它将保留在父进程的内存范围内。例如,您可以分叉100个子进程(不写入内存,只读取)并检查整体内存使用情况。它不会是parent_memory_usage * 100,而是更少。