python - 多处理还是 os.fork、os.exec?

标签 python

我正在使用多处理模块来 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/

相关文章:

python - 为什么 QFileSystemWatcher 适用于目录而不适用于 Python 中的文件?

python - 列表元素的相似性

python - 如何找出缺少哪个 Python 关键字参数?

python - 从字典创建数据框,其中值是可变长度列表

Python Boto S3 与 Amazon S3 中的自定义域一起使用

python - 尝试更改 pandas 数据帧中的索引值时出错(IndexError : too many indices for array)

python - 如何在散点图中圈出不同的数据集?

python - 有条件地将多个项目添加到Python中的字典

python - 机器学习: How to regularize output and force them to be away from 0?

python - 在 Sage 中使用 gnuplot 时出错,但在常规 Python 中工作正常