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