【问题标题】:how many processes can be created with python os.fork()python os.fork() 可以创建多少个进程
【发布时间】:2013-12-25 11:19:33
【问题描述】:

如果我在下面这样做:

for i in range(10000):
    os.fork()

发生了什么事?不考虑收割..我只是想知道 os.fork() 可以在linux中制造多少进程,如果它就像windows一样,只能制造大约2000个进程,接下来的8000个进程将如何做?
谢谢。

【问题讨论】:

  • os.fork 创建一个新进程。学究起来,新进程包含一个新线程,因此确实创建了一个新线程,但这可能不是您的意思。
  • 你为什么要这样做?
  • 与 POSIX 分叉相同的编号。你的问题不是关于 python,而是关于 POSIX/Linux。
  • @msw 我大概有一万个虚拟机,我想ssh每台机器然后做点什么,所以我用os.fork来做。

标签: python fork


【解决方案1】:

os.fork() 函数创建调用进程的副本。线程是在 Python 中使用threading 模块创建的。

您可以在类似 UNIX 的系统(例如 Linux)上创建的进程数量通常受到计算机内存量和操作系统中设置的某些限制的限制。命令ulimit -a 的输出显示了所有限制。

您可以在进程中创建的线程数通常受到进程拥有的堆栈空间量和进程允许拥有的最大(虚拟)内存量的限制. ulimit 也显示了这些限制。

请注意,当您使用标准的 Python 实现(也称为 CPython)时,一次只有 一个 线程可以执行 Python 字节码。

【讨论】:

    【解决方案2】:

    os.fork() 产生一个新的操作系统级进程。对这些数量的任何限制都不取决于 Python,而是取决于操作系统。根据this previous question 的说法,在 Linux 上,您可以通过以下方式了解任何软件对其施加的限制:

    cat /proc/sys/kernel/pid_max
    

    但这可能会受到/etc/security/limits.conf 的进一步限制。如果这些没有先打到你,你最终会遇到可用硬件资源的问题——你的代码是fork bomb,并且是简单的拒绝服务攻击类型(对进程数量的任何软件限制都设置为 避免这种攻击)。

    【讨论】:

    • 还有ulimit -u
    • @lvc 我现在明白了,比如我的cpu,mem或者其他限制只能支持2000个线程,剩下的怎么办?会发生什么坏事?
    • @lvc 看来我需要一个更好的主意。我想办法,将我的 10,000 台虚拟机分成许多组。
    【解决方案3】:

    代码并没有像你想象的那样做。

    当你分叉时,你实际上是在复制当前进程。

    这意味着在分叉之后,两个进程将从同一点继续迭代。然后两者都将分叉,依此类推...创建的线程数将为指数

    例子:

    import os
    for i in range(3):
        os.fork();
    
    print "T"
    

    执行时,您应该看到 2^3 = 8 个进程。

    回到你原来的问题,因为fork创建进程,线程数的限制是无关紧要的。

    【讨论】:

    • 。在我的代码中,在循环期间,如果 os.fork ,它将继续,否则,它将做一些事情。所以它应该运作良好。不过你说的效果,确实很有意思,之前没注意过
    猜你喜欢
    • 2012-01-04
    • 2020-10-19
    • 2017-06-18
    • 2010-10-30
    • 2017-03-06
    • 1970-01-01
    • 2017-02-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多