我正在使用多处理模块来 fork 子进程。由于在 fork 时,子进程获取父进程的地址空间,因此我为父进程和子进程获得了相同的记录器。我想清除从父进程继承的任何值的子进程的地址空间。我知道多处理在较低级别执行 fork() 而不是 exec()。我想知道在我的情况下使用多处理是否好,或者我应该结合使用 os.fork() 和 os.exec() 还是有任何其他解决方案?
谢谢。
最佳答案
由于 multiprocessing
正在运行您程序中的一个函数,就好像它是一个线程函数一样,它肯定需要您进程状态的完整副本。这意味着执行 fork()
。
使用 multiprocessing
提供的更高级别的接口(interface)通常更好。至少你自己不应该关心 fork()
返回码。
os.fork()
是一个较低级别的函数,提供较少的开箱即用服务,但您当然可以将它用于任何 multiprocessing
用于...以 multiprocessing
代码的部分重新实现为代价。所以,我认为 multiprocessing
应该适合您。
但是,如果您进程的内存占用太大而无法复制它(或者如果您有其他原因避免 fork ——打开与数据库的连接、打开日志文件等),您可能必须创建您想要的功能在新进程中运行一个单独的 python 程序。然后您可以使用 subprocess
运行它,将参数传递给它的 stdin
,捕获它的 stdout
并解析输出以获得结果。
UPD: os.exec...
family of functions很难用于大多数目的,因为它用一个生成的进程替换了您的进程(如果您运行与正在运行的程序相同的程序,它将从一开始就重新启动,不保留任何内存数据)。但是,如果您确实不需要继续执行父进程,exec()
可能会有一些用处。
根据我的个人经验:os.fork()
经常用于在 Unix 上创建守护进程;我经常使用subprocess
(通信是通过stdin/stdout);几乎从未使用过多处理;我一生中没有一次需要 os.exec...()
。
关于python - 多处理还是 os.fork、os.exec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14701901/