我在 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
. 我们将其捕获到break
for 循环之外并显示成功创建的线程数。
因为daemon
设置为 True,所有线程在程序结束时终止。
如果连续运行几次,您可能会看到每次都会创建不同数量的线程。在我发布此回复的机器上,我在一次运行中最少有 18,835,在另一次运行中最多有 18,863。并且您对代码的摆弄越多,例如,为了试验或查找更多信息而添加的代码越多,您会发现可以/将创建的线程越少。
那么,如何将其应用于现实世界。
好吧,服务器可能需要能够启动三位数的线程,但在大多数其他情况下,如果您认为要生成大量线程,则应该重新评估您的游戏计划。
如果您使用 Python,您需要考虑一件事:如果您使用 Python 的标准发行版,您的系统一次只会执行一个 Python 线程,包括程序的主线程,因此向您的程序中添加更多线程在 Python 中使用线程模块时,为您的系统添加程序或更多内核并不能真正为您带来任何好处。您可以研究有关 GIL / Global Interpreter Lock 的所有迂腐细节和极端观点,以获取更多信息。
这意味着 cpu 绑定(计算密集型)代码不会从将其分解为线程中受益匪浅。
然而,I/O 绑定(等待文件读/写、网络读或用户 I/O)代码从多线程中受益匪浅!因此,为每个到基于 Python 的服务器的网络连接启动一个线程。
线程也非常适合在设定的时间段触发/抛出/引发信号,或者只是更合乎逻辑地阻止代码的处理部分。