试一试
from threading import Thread
from time import sleep
from datetime import datetime
from random import randint
def download(name):
print(f'{name}开始下载:{datetime.now()}')
sleep(randint(2, 7))
print(f'{name}下载结束:{datetime.now()}')
if __name__ == '__main__':
t1 = Thread(target=download, args=('明日战纪',))
t2 = Thread(target=download, args=('斗罗大陆',))
t3 = Thread(target=download, args=('独行月球',))
# 示例1: 三个电影都下载结束后打印"全部下载完成"
# t1.start()
# t2.start()
# t3.start()
#
# # 1. 子线程对象.join() - 阻塞当前线程直到指定子线程任务完成
# t1.join()
# t2.join()
# t3.join()
# print('==============全部下载完成!============')
# 示例2:前两个电影都下载完成后才下载第三个电影
t1.start()
t2.start()
t1.join()
t2.join()
t3.start()
线程池工作原理:先创建指定个数的线程,然后添加多个任务(任务数量>线程数量),让线程池中的线程去执行添加的所有任务,直到所有任务都执行完(线程池中的每个线程可能会执行多个任务)。
from threading import Thread, current_thread
from time import sleep
from datetime import datetime
from random import randint
from concurrent.futures import ThreadPoolExecutor
def download(name):
print(f'{name}开始下载:{datetime.now()}', current_thread())
sleep(randint(2, 7))
print(f'{name}下载结束:{datetime.now()}')
if __name__ == '__main__':
# 方案1:直接使用多线程下载1000个电影
num = 0
for _ in range(10):
ts = []
for x in range(100):
num += 1
t = Thread(target=download, args=(f'电影{num}',))
ts.append(t)
t.start()
for x in ts:
x.join()
方案2:使用线程池下载1000个电影
pool = ThreadPoolExecutor(3)
pool.submit(download, '肖生克的救赎')
pool.submit(download, '霸王别姬')
2)同时添加多个任务: map(函数, 参数对应的序列)
注意:使用map添加多个任务的时候,任务对应的函数必须是有且只有一个参数的函数
pool.map(download, ['V字仇杀队', '恐怖游轮', '沉默的羔羊'])
pool.shutdown()
执行指令的工具: Windows - 命令提示符(cmd) 、Mac - 终端