我在 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 的服务器的网络连接启动一个线程。
线程也非常适合在设定的时间段触发/抛出/引发信号,或者只是更合理地阻止代码的处理部分。