
今天用到是python自带的库: threading
在之前发布的 《python-多线程-初识》中,当时使用的是一个for in的语句,在语句的内部创建线程,而没有添加限制条件。那么这样就可能会有一个问题,当任务数较大时,线程并发数也会达到较大的一个数值,那么就会给个人电脑或者对端服务器带来不小的负担,还有可能会触发对端服务器的某些自我保护方式,那么有什么方法可以有效的规避这种情况呢,它今天来了。
使用工具:threading,requests
环境准备:
- 搭建python开发环境
- 若前期未安装requests库的话,需要安装一下
pip install requests
源码讲解环节
好的,下面就是喜闻乐见的源码讲解环节了(´◔౪◔)
import threading
import requests
# 文件下载模块
def down_loads(i,url):
header = {"User-Agent":"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)"}
r = requests.get(url, headers=header).content
with open(r'123\{}.jpg'.format(i), 'wb')as f:
f.write(r)
print('已保存第{}张图片'.format(i))
# 多线程模块,需要插入任务数 与 最大线程数
def threading_run(tasks,threads):
print('============多线程=============')
for i in range(len(list)):
url = 'https://res.xiaoqinre.com/' + 'images/comic/659/1316010/' + list[i]
if threading.activeCount() < threads+1 and tasks != 0:
# 多线程调用方法,args传递参数
t = threading.Thread(target=down_loads, args=(i, url))
t.start()
# 开启新的进程后,任务数减一
tasks -= 1
print(i)
print('当前进程数:{}'.format(threading.activeCount()-1))
print('当前任务数:{}'.format(tasks))
# 因为程序本身即为一个线程,所以现实的最大线程数=规定的最大线程数+1
# 若目前的线程数已经到达了最大线程数,则进入等待,等待当前的线程数小于最大线程数,再执行后面的代码
if threading.activeCount() == threads+1:
# 等待前面的进程结束后,再执行后面的代码,这里为1,因为程序本身即为一个线程
while threading.activeCount() == threads+1:
pass
# 当只有程序本身时,即所有任务线程都执行完毕,则退出方法
while threading.activeCount() != 1:
pass
# 任务列表
list = ["1589955488pKXI8k7R_ZKj99T1.png","1589955488RTJR8dCxDnY6pwCw.png","1589955487Bnk_GpCbA8Sw6QBS.png","1589955486AdJQK8Qrsp_G1wn6.png"]
# 向方法中传入任务列表的长度 与 最大线程数
threading_run(len(list),3)
print('图片下载完毕!!!')
效果展示
============多线程=============
0
当前进程数:1
当前任务数:3
1
当前进程数:2
当前任务数:2
2
当前进程数:3
当前任务数:1
已保存第0张图片
3
当前进程数:3
当前任务数:0
已保存第2张图片
已保存第1张图片
已保存第3张图片
图片下载完毕!!!
那么本次的分享就在这里了,喜欢的话麻烦点赞关注一下
不喜欢的话可以去看下小编的其他文章,肯定有喜欢的
都不喜欢的话可以点个关注,万一以后有喜欢的呢(๑•̀ㅂ•́)و✧

网友评论