多进程或者多线程

发布时间 2023-09-04 20:37:45作者: yx1257091748

多进程或者多线程

  • 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)