python中线程数的最大限制

Paw*_*ngh 8 python multithreading

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

Ian*_*ote 5

我在 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()
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果无法创建线程,Python 会抛出一个RuntimeError. 我们将其捕获到breakfor 循环之外并显示成功创建的线程数。

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

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

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

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

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

这意味着 cpu 绑定(计算密集型)代码不会从将其分解为线程中受益匪浅。

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

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

  • 好点,回想起来我应该提到这一点。是的,多处理模块将是您为计算机密集型任务选择的选择。 (2认同)