python爬虫无法有效控制线程数问题的解决(实测有效)

2023-05-16

使用爬虫爬取某网站图片时,无法很好的控制线程数,线程总是超级多,虽然用网上的方法限制为10个线程,实际代码跑起来线程远多于10个,内存会被逐步消耗掉,如下图:
在这里插入图片描述
经过查找资料,原来的方法锁定信号的变量sem在线程内阻塞,等待前面的线程执行结束。就是说实际上有多少任务就会开多少线程,只是超过限制的部分线程在线程内阻塞。内存依然会被消耗殆尽。
为了控制最大线程数,达到最大线程时应在线程外阻塞,有线程结束后再创建新线程,改进如下:

import threading
import time

sem=threading.Semaphore(10) #限制线程的最大数量为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(使用前将#替换为@)

python爬虫无法有效控制线程数问题的解决(实测有效) 的相关文章

随机推荐