【问题标题】:Maximum limit on number of threads in pythonpython中线程数的最大限制
【发布时间】:2018-08-04 20:49:39
【问题描述】:

我在 python 中使用线程模块。如何知道我的系统可以拥有多少个最大线程?

【问题讨论】:

标签: python multithreading


【解决方案1】:

我在 python 中使用线程模块。如何知道最大数量 我的系统上可以有线程吗?

我似乎没有找到一个硬编码或可配置的 MAX 值,但肯定有一个限制。运行以下程序:

import threading
import time


def mythread():
    time.sleep(1000)

def main():
    threads = 0     #thread counter
    y = 1000000     #a MILLION of 'em!
    for i in range(y):
        try:
            x = threading.Thread(target=mythread, daemon=True)
            threads += 1    #thread counter
            x.start()       #start each thread
        except RuntimeError:    #too many throws a RuntimeError
            break
    print("{} threads created.\n".format(threads))

if __name__ == "__main__":
    main()

我想我应该提到这是使用 Python 3。

第一个函数mythread() 是将作为线程执行的函数。它所做的只是休眠 1000 秒然后终止。

main() 函数是一个 for 循环,它尝试启动一百万个线程。 daemon 属性设置为 True,这样我们就不必手动清理所有线程。

如果无法创建线程,Python 会抛出 RuntimeError。我们从 for 循环中捕捉到 break 并显示成功创建的线程数。

因为daemon 设置为True,所以所有线程都会在程序结束时终止。

如果您连续运行几次,您可能会发现每次都会创建不同数量的线程。在我发布此回复的机器上,我在一次运行中最少有 18,835 个,而在另一次运行中最多有 18,863 个。而且,您对代码的修改越多,例如,为了试验或查找更多信息而添加的代码越多,您会发现可以/将要创建的线程就越少。

那么,如何将其应用于现实世界。

好吧,服务器可能需要能够启动三位数的线程,但在大多数其他情况下,如果您认为您将要生成大量线程,您应该重新评估您的游戏计划。

如果您使用 Python,您需要考虑的一件事:如果您使用 Python 的标准发行版,您的系统一次只会执行一个 Python 线程,包括程序的主线程,因此添加更多在 Python 中使用 threading 模块时,程序的线程或系统的更多内核并不能真正为您带来任何好处。您可以研究有关 GIL / Global Interpreter Lock 的所有迂腐细节和极端观点,以获取更多信息。

这意味着 CPU 密集型(计算密集型)代码不会因将其分解为线程而受益匪浅。

I/O 绑定(等待文件读/写、网络读或用户 I/O)代码从多线程中受益匪浅!因此,为每个与基于 Python 的服务器的网络连接启动一个线程。

线程也非常适合在设定的时间段触发/抛出/引发信号,或者只是更合理地阻止代码的处理部分。

【讨论】:

    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多