多进程或者多线程
多进程或者多线程
-
threading 线程模块
-
muliprocessing 进程模块
-
优点:可以为相关阻塞的操作单独开启线程或者进程,阻塞操作就可以异步执行。
-
弊端:无法无限制的开启多线程或多进程。因为如果占用过多的cpu资源,会严重影响对外界响应的效率。
用线程模块来实现多任务:
# 老朋友了 threading(线程) 和 multiprocessing (进程)
import multiprocessing
import threading # 线程模块
import time
# 使用线程池的方式执行
# 开启计时
start_time = time.time()
# 模拟请求的发送
def get_page(str):
print(f'正在下载{str}...')
time.sleep(2)
print(f'下载成功!{str}')
name_list = ['aa','bb','cc','ee','ff','gg']
for i in name_list:
thread = threading.Thread(target=get_page,args=(i,),daemon=False) # 守护主线程
# thread.setDaemon(False)
thread.start() # 每次循环到一个“url”,就开启一个线程
end_time = time.time()
print(end_time-start_time,"主线程结束了")
线程池,进程池(适当使用)
-
进程池: from multiprocessing import Pool # 进程池
-
线程池: from multiprocessing.dummy import Pool # 导入线程池模块
-
好处:可以降低系统对进程或者线程创建和销毁的频率
-
弊端:池中的进程或者线程的数量是有上限的
用线程池实现多任务:
import time
from multiprocessing.dummy import Pool # 导入线程池模块
# 使用线程池的方式执行
# 开启计时
start_time = time.time()
# 模拟请求的发送
def get_page(str):
print(f'正在下载{str}...')
time.sleep(2)
print(f'下载成功!{str}')
name_list = ['aa','bb','cc','ee','ff','gg']
# 实例化一个线程池对象 pool = Pool(int) int表示要开启多少个线程对象
pool = Pool(4)
pool.map(get_page,name_list) # 将列表name_list中每一个列元素交给get_page进行处理 ,最终map的返回值就是每一个get_page的返回值组成的列表
end_time = time.time()
print(end_time-start_time)