from time import sleep
from threading import Thread, Lock # 引入threading库中锁函数
# 每个下载完成后去更新一个计数
count = 0 # 记录一共下载了多少个视频
thread_tasks = 1000000 # 每个线程的任务数
thread_num = 100 # 线程数
lock = Lock() # 多线程方法的时候使用的锁,操作过程:锁定 - 释放
def download():
global count # 使用全局变量,在这里声明一下
for i in range(thread_tasks):
lock.acquire() # 让当前线程先锁定共享的资源,等待操作完成,再释放
count += 1 # 这里是所有进行共享操作的资源——计数器
lock.release() # 将锁释放,其他进程再进行操作
threads = [] # 创建一个所有子线程列表
# 遍历预设线程总数thread_num,开启所有子线程
for task in range(thread_num):
t = Thread(target=download)
t.start()
threads.append(t) # 将所有子线程加入子线程列表
# 遍历子线程列表join(),让其拥堵主线程,等待所有子线程执行完毕,再继续执行主线程下面代码
for t in threads:
t.join() # 让主线程等待所有子线程执行完毕后,再继续执行主线程下面代码
print(f"应该下载数为:{thread_num * thread_tasks}") # 打印应该执行的总数——计数器count
print(f'实际下载数为:{count}') # 打印实际执行的总数——所有线程修改结束后的count值