这两天写了一个多线程脚本跑业务,因为开的线程是1000个,所以发现脚本运行时不超过10分钟就会导致电脑内存爆满直到无法运行程序卡死退出。
网上看了一些文章发现可能是在将线程添加到线程列表里,且外部循环加上while True死循环后,线程列表无限扩大的问题。
最终通过代码添加thread.join()和threads.remove(thread)解决了内存增加这个问题。以下为代码。
threads = [] # 线程表
def do_something():
print(1)
if __name__ == "__main__":
while 1:
for i in range(10000):
threadmax.acquire()
t = threading.Thread(target=do_something)
t.start()
threads.append(t)
for t in threads:
t.join() # 阻滞进程
threads.remove(t) # 待执行结束删除子进程
在后续的测试中发现注释掉t.join()一样会导致内存快速增加到爆满,所以问题的核心应该是未添加t.join()阻滞进程时,有部分未结束运行的进程导致内存占用,且在执行结束后未删除子进程。
更详细的解释参考:https://blog.wangtwothree.com/code/196.html#comment-744