使用爬虫爬取某网站图片时,无法很好的控制线程数,线程总是超级多,虽然用网上的方法限制为10个线程,实际代码跑起来线程远多于10个,内存会被逐步消耗掉,如下图:
经过查找资料,原来的方法锁定信号的变量sem在线程内阻塞,等待前面的线程执行结束。就是说实际上有多少任务就会开多少线程,只是超过限制的部分线程在线程内阻塞。内存依然会被消耗殆尽。
为了控制最大线程数,达到最大线程时应在线程外阻塞,有线程结束后再创建新线程,改进如下:
import threading
import time
sem=threading.Semaphore(10)
def savepic(page,thispath):
if not os.path.exists(thispath+page.split('/')[-1]):
with open(thispath+page.split('/')[-1],'wb') as f:
f.write(getresponse(page).content)
print(thispath+page.split('/')[-1]+'保存成功')
else:
print("文件"+thispath+page.split('/')[-1]+"已存在")
time.sleep(1)
sem.release()
if __name__ == "__main__":
pageurls=['*****','**','']
thispath='d:\\mypic\\'
for page in pageurls:
sem.acquire()
t=Thread(target=savepic,args=(page,thispath,))
t.start()
经过验证,完美实现目的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)