首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >多处理叉() vs spawn()

多处理叉() vs spawn()
EN

Stack Overflow用户
提问于 2020-09-28 04:14:26
回答 2查看 21.7K关注 0票数 38

我在读python上关于这两个人的描述

产卵 父进程启动一个新的python解释器进程。子进程只继承运行process ()方法所需的资源。特别是,来自父进程的不必要的文件描述符和句柄将不会被继承。使用此方法启动进程比使用叉或叉服务器要慢得多。可在Unix和Windows上使用。Windows和macOS上的默认设置。 父进程使用os.fork()对Python解释器进行分叉。子进程开始时实际上与父进程相同。父进程的所有资源都由子进程继承。请注意,安全分叉多线程进程是有问题的。仅在Unix上可用。Unix的默认设置。

我的问题是:

  1. 因为它不试图识别要复制的资源,所以分叉更快吗?
  2. 是因为fork复制了所有的东西,所以它会“浪费”更多的资源()吗?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-09-28 05:25:27

  1. 因为它不试图识别要复制的资源,所以分叉更快吗?

是的,要快得多。内核可以克隆整个进程,并且只将修改过的内存页作为一个整体进行复制。将资源输送到新进程并从零开始启动解释器是不必要的。

  1. 是因为fork复制了所有的东西,所以它会“浪费”更多的资源()吗?

分叉在现代内核上只做“抄写”,它只影响内存页,这实际上是改变的。但要注意的是,“写”已经包含了对CPython中的对象的迭代。这是因为对象的引用计数会增加。

如果长时间运行的进程中有大量的小对象在使用,这可能意味着您浪费更多的内存,而不是使用派生。有趣的是,我还记得Facebook声称他们的Python进程从“叉”切换到“产卵”,内存使用量大大减少了。

票数 13
EN

Stack Overflow用户

发布于 2021-02-09 04:38:01

在3 多处理启动方法之间有一种权衡

  1. 更快,因为它可以复制父进程的整个虚拟内存,包括初始化的Python解释器、加载的模块和在内存中构造的对象。 但是叉子不复制父进程的线程。因此,在父进程中由其他线程持有的锁(在内存中)被卡在子线程中,而不拥有用于解锁的线程,当代码试图获取其中任何线程时,就会导致死锁。此外,任何带有分叉线程的本机库都将处于中断状态。 复制的Python模块和对象可能很有用,或者它们可能不必要地膨胀每个分叉子进程。 子进程还“继承”OS资源,如打开文件描述符和打开网络端口。这也会导致问题,但是Python可以解决其中的一些问题。 因此,叉子速度快、不安全,而且可能会膨胀。 然而,这些安全问题可能不会引起麻烦,取决于子进程所做的事情。
  2. 派生从零开始启动子进程,而不需要父进程的内存、文件描述符、线程等。从技术上讲,派生出当前进程的一个副本,然后子进程立即调用exec用新的替换自己,然后要求加载目标模块并运行可调用的目标。 因此,生成是安全的、紧凑的、速度较慢的,因为它必须加载、初始化自身、读取文件、加载和初始化模块等。 但是,与子进程所做的工作相比,可能不会显着地慢于
  3. 叉服务器分叉当前进程的副本,该进程可以简化为一个新的进程。这将成为“叉服务器”进程。然后,每次启动子进程时,它都会要求叉服务器对子进程进行分叉,并运行其目标可调用性。 这些子进程都是从紧凑型开始的,并且没有锁。 叉服务器更复杂,而且没有详细的文档。Bojan Nikolic的博客文章解释了更多关于forkserver和它的秘密set_forkserver_preload()方法预加载一些模块。注意使用无证方法(尤指无证方法)。在Python3.7.0中的bug修复之前。 因此,叉服务器是快速、紧凑和安全的,但是它更复杂,而且没有很好的文档化的

这些文档并不是很好,所以我结合了来自多个来源的信息,并做出了一些推论。对任何错误都要做评论。

票数 70
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64095876

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档