Python中多线程代码执行完成后,为何线程没有自动注销?
我写了个每 50 秒自动登陆查询多个 ID 相关信息的代码,用到了多线程,每次执行前,都清空了一次多线程列表,thread_list = [],为何子线程执行后,print 出来的线程 ID 名一直是累加的,就是
thread - 1,
thread - 2,
………………
thread - 1000
一直是这样加下去,而不是每 50 秒恢复一次。这是不是代表服务器同时打开了这么多线程呢?请问如何真正清空线程,让服务器只执行真正用到的 10 个线程。
代码写得较粗糙,恳请各位帮优雅优化一下,感谢
import threading
import time
import requests
from threading import current_thread
def autocheck():
while True:
bktels = []
thread_list = []
bktels = [‘ID1’,‘ID2’,‘ID3’,‘ID4’,‘ID5’,‘ID6’,‘ID7’,‘ID8’,‘ID9’,‘ID10’]
for n in bktels:
th = threading.Thread(target=getPID, args=(n,))
thread_list.append(th)
for t in thread_list:
t.start()
for t in thread_list:
t.join()
time.sleep(50)
def getPID(n):
threada = threading.current_thread()
str2 = ‘,’.join(’%s’ %id for id in n)
print (threada.getName() +’ ID:’+str2)
url = ‘http://127.0.0.1/login.php?id=’ + str2
html=requests.get(url)
print html.text
autocheck()
Python中多线程代码执行完成后,为何线程没有自动注销?
在Python中,多线程执行完成后线程不会自动注销,主要是因为线程对象在Python中是一个普通的对象,其生命周期由垃圾回收机制(GC)管理。即使线程的run()方法执行完毕,线程对象本身依然存在于内存中,直到没有任何引用指向它时,GC才会回收它。
这通常不是问题,因为线程对象占用的内存很小。但如果你在循环中创建大量线程,并且没有及时释放对线程对象的引用,就可能导致内存泄漏。要确保线程对象被正确回收,可以在线程完成后显式地移除对它的引用,或者使用threading.Thread的子类并重写__del__方法(但不推荐,因为__del__方法的执行时机不确定)。
一个更常见的做法是使用threading.Thread的join()方法等待线程结束,然后让线程对象自然超出作用域。例如:
import threading
import time
def worker():
print("线程开始执行")
time.sleep(2)
print("线程执行完毕")
# 创建并启动线程
t = threading.Thread(target=worker)
t.start()
# 等待线程结束
t.join()
# 此时线程对象t仍然存在,但已经没有活动线程了
print("主线程结束")
# 线程对象t将在后续被GC回收
如果你需要管理大量线程,考虑使用线程池(concurrent.futures.ThreadPoolExecutor),它可以更好地管理线程的生命周期和资源。
简单说,线程对象不自动注销是正常的,由GC管理,确保及时释放引用即可。
python 不清楚,java 中线程 id 是一直自增的,线程执行完就死了啊,你这个需求是不是考虑线程池?
以前也遇到过一样的问题,当出现 thread - 1000 的时候表示真的有 1000 个线程在运行,可以用 threading.activeCount()函数检测下。最后改用线程池解决了

