2,闭包
闭包,就是将数据封装再一个包(区域)中。
使用的时候去里面取,本质上闭包是基于函数嵌套搞出来的一个特殊嵌套
-
闭包特殊应用场景1:封装数据防止污染全局
def func(age): name = 'feifei' def f1(): print(name,age) def f2(): print(name,age) def f3(): print(name,age) f1() f2() f3() func(123)
-
闭包特殊应用场景2:封装数据到一个包里,使用时再取
def task(age): def inner(): print(age) return inner v1 = task(11) v2 = task(22) v3 = task(33) v1() # 11 v2() # 22 v3() # 33
-
多线程处理任务(下载视频)
### 多线程下载
from concurrent.futures.thread import ThreadPoolExecutor
import requests
## 线程池,总共有10个进程可以同步并行处理任务
POOL = ThreadPoolExecutor(10)
def outer(file_name):
def done(arg):
# 视频内容
content = arg.result()
with open(file_name,mode='wb') as file_object:
file_object.write(content)
return done
def task(url):
res = requests.get(
url=url,
headers={
'user-agent':
"Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1','Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50,Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11"
}
)
print('\n----->下载中 <------\n',res.content,'\n----->下载完成 <------\n')
# 三个视频信息
video_list = {
('第一个视频.mp4','http://imss-video-sz.huawei.com/download/8a821e156d208817016d3d6981a5034e'),
('第二个视频.mp4','http://imss-video-sz.huawei.com/download/8a821e156d208817016d3d6b560f0350'),
('第三个视频.mp4','http://imss-video-sz.huawei.com/download/8a821e156d208817016d3d6981a5034e'),
}
for item in video_list:
# 去线程池取取一个线程,让他取处理任务
future = POOL.submit(task,url=item[1])
# 当执行完成task函数之后,自动执行下一个函数
future.add_done_callback(outer(item[0]))
print(item[0], item[1])