Python 多处理或os.fork、os.exec?

Python 多处理或os.fork、os.exec?,python,Python,我正在使用多处理模块来派生子进程。因为在分叉时,子进程获取父进程的地址空间,所以我为父进程和子进程获取相同的记录器。我想清除子进程的地址空间中从父进程带入的任何值。我知道多处理在较低的级别上执行fork(),但不执行exec()。我想知道在我的情况下使用多处理是好是坏,还是应该选择os.fork()和os.exec()的组合,或者是否有其他解决方案 谢谢。由于多处理正在从程序中运行一个函数,就像它是一个线程函数一样,因此它肯定需要一个进程状态的完整副本。这意味着执行fork() 使用多处理提供的

我正在使用多处理模块来派生子进程。因为在分叉时,子进程获取父进程的地址空间,所以我为父进程和子进程获取相同的记录器。我想清除子进程的地址空间中从父进程带入的任何值。我知道多处理在较低的级别上执行fork(),但不执行exec()。我想知道在我的情况下使用多处理是好是坏,还是应该选择os.fork()和os.exec()的组合,或者是否有其他解决方案


谢谢。

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

使用
多处理
提供的更高级接口通常更好。至少您自己不应该关心
fork()
返回代码

os.fork()
是一个较低级别的函数,提供了较少的开箱即用服务,尽管您当然可以将其用于任何
多处理
用于。。。以部分重新实现
多处理
代码为代价。因此,我认为,
多处理
应该适合您

但是,如果进程的内存占用太大而无法复制它(或者如果您有其他原因来避免分叉——打开到数据库的连接、打开日志文件等),则可能必须将要在新进程中运行的函数设置为单独的python程序。然后,您可以使用
子流程运行它,将参数传递给它的
stdin
,捕获它的
stdout
,并解析输出以获得结果

UPD:
os.exec…
在大多数情况下都很难使用,因为它用派生的进程替换了您的进程(如果您运行与正在运行的程序相同的程序,它将从一开始就重新启动,而不保留任何内存中的数据)。但是,如果确实不需要继续父进程执行,
exec()
可能会有一些用处


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

您可以将子进程中的记录器重新绑定到自己的日志。我不知道其他操作系统,但在Linux上,forking并没有复制整个内存占用(正如Ellioh提到的),而是使用了“写时复制”的概念。因此,在子进程中更改某些内容之前,它将保留在父进程的内存范围内。例如,您可以分叉100个子进程(不写入内存,只读取)并检查总体内存使用情况。这将不是
父对象\u内存\u使用*100
,而是更少。

+1此外,如果您不想重用父对象,只需创建新的对象即可。如果希望安全,请覆盖引用:)