我在python中使用Threading模块。如何知道我的系统上可以有多少个最大线程?
答案 0 :(得分:1)
我正在python中使用Threading模块。如何知道最大数量 我的系统上可以有多个线程?
我从未发现过似乎没有硬编码或可配置的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 RuntimeError
break
print("{} threads created.\n".format(threads))
if __name__ == "__main__":
main()
我想我应该提到这是使用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的所有详细信息和超crecrepidarian意见,以获取更多信息。
这意味着cpu绑定(计算密集型)代码不会因将其分解为线程而大大受益。
I / O绑定(等待文件读/写,网络读或用户I / O)代码从多线程中受益匪浅!因此,为与基于Python的服务器的每个网络连接启动一个线程。
线程还可以很好地在设定的时间触发/引发/引发信号,或者只是更逻辑地阻止代码的处理部分。
答案 1 :(得分:0)
通常,您不希望计算机上的线程多于CPU内核。
为了知道您的计算机有多少个CPU内核,请使用:(对于Windows,是;对于Linux,我不知道,但是可能有点类似)
import multiprocessing #standard in python 3
print(multiprocessing.cpu_count())