今天用到是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张图片

图片下载完毕!!!

那么本次的分享就在这里了,喜欢的话麻烦点赞关注一下

不喜欢的话可以去看下小编的其他文章,肯定有喜欢的

都不喜欢的话可以点个关注,万一以后有喜欢的呢(๑•̀ㅂ•́)و✧