实际工作中会遇到有成千上万个任务想使用多线程来完成,而计算机无法同时处理这么多线程,通常来说会因为内存消耗完而无法创建新的线程。
在诸多大佬的博客中找到如下解决方案:
import threading
import time
sem=threading.Semaphore(4) #限制线程的最大数量为4个
def gothread():
with sem: #锁定线程的最大数量
for i in range(5):
print(threading.current_thread().name,i)
time.sleep(1)
for i in range(5000):
threading.Thread(target=gothread).start()
但是该方案无法解决我遇到的问题,内存依然会沾满。通过分析,锁定信号的变量sem在线程内阻塞,等待前面的线程执行结束。就是说实际上有多上任务就会开多少线程,只是超过限制的部分线程在线程内阻塞。内存依然会被消耗殆尽。为了控制最大线程数,达到最大线程时应在线程外阻塞,有线程结束后再创建新线程,改进如下:
import threading
import time
sem=threading.Semaphore(4) #限制线程的最大数量为4个
def gothread():
for i in range(5):
print(threading.current_thread().name,i)
time.sleep(1)
sem.release()
for i in range(5000):
sem.acquire()
threading.Thread(target=gothread).start()