美文网首页
[日更挑战-第八弹]python-多线程-限制线程并发个数机制

[日更挑战-第八弹]python-多线程-限制线程并发个数机制

作者: 小明阿婆 | 来源:发表于2020-05-24 21:49 被阅读0次



今天用到是python自带的库: threading

在之前发布的 《python-多线程-初识》中,当时使用的是一个for in的语句,在语句的内部创建线程,而没有添加限制条件。那么这样就可能会有一个问题,当任务数较大时,线程并发数也会达到较大的一个数值,那么就会给个人电脑或者对端服务器带来不小的负担,还有可能会触发对端服务器的某些自我保护方式,那么有什么方法可以有效的规避这种情况呢,它今天来了。

使用工具:threading,requests



环境准备:


  1. 搭建python开发环境
  2. 若前期未安装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张图片
图片下载完毕!!!



那么本次的分享就在这里了,喜欢的话麻烦点赞关注一下
不喜欢的话可以去看下小编的其他文章,肯定有喜欢的
都不喜欢的话可以点个关注,万一以后有喜欢的呢(๑•̀ㅂ•́)و✧



相关文章

网友评论

      本文标题:[日更挑战-第八弹]python-多线程-限制线程并发个数机制

      本文链接:https://www.haomeiwen.com/subject/plksahtx.html