一、线程池、进程池
开进程、开线程都需要消耗资源,只不过两者比较的情况线程消耗的资源比较少
在计算机能够承受范围之内最大限度的利用计算机
什么是池?
在保证计算机硬件安全的情况下最大限度的利用计算机
池其实是降低了程序的运行效率,但是保证了计算机硬件的安全
(硬件的发展跟不上软件的速度)
# 调用 from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor # 建池子 pool = ProcessPoolExecutor() # 默认是当前计算机cpu的个数 pool = ThreadPoolExecutor(5) # 括号可穿参数,不传默认代表cpu个数*5 res = pool.submit(task,i).add_done_callback(call_back) # 提交任务,绑定一个回调函数,一旦该任务有结果,立刻执行对于的回调函数 res.result() # 原地等待任务的返回结果 pool.shutdown() # 关闭池子,等待池子中所有的任务执行完毕之后,才会往下运行代码

import time
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
# pool = ThreadPoolExecutor(5) # 括号内可以传参数指定线程池内的线程个数
# # # 也可以不传,不传默认是当前所在计算机的 CPU的个数乘5
import os
pool = ProcessPoolExecutor() # 默认是当前计算机cpu的个数
'''
尺子中创建的进程/线程创建一次就不会再创建了,
至始至终用的都是最初的那几个,这样的话节省了反复开辟进程/线程的资源
'''
def task(n):
print(n,os.getpid()) # 查看当前进程号
time.sleep(2)
return n*2
def call_back(n):
print('拿到了异步提交的任务的返回结果:',n.result())
'''
提交任务的方式
同步:提交任务之后,原地等待任务的返回结果,期间不做任何事
异步:提交任务之后,不等待任务的返回结果,直接指向下一步
'''
# pool.submit(task,1) # 朝线程池中提交任务 ,异步提交
# print('主')
'''
异步回调机制:当异步提交的任务有返回结果之后,会自动出发回调函数的执行
'''
# if __name__ == '__main__':
# t_list = []
# for i in range(5):
# # 提交任务的时候,绑定一个回调函数,一旦该任务有结果,立刻执行对于的回调函数
# res = pool.submit(task,i).add_done_callback(call_back)
# # print(res.result()) # 原地等待任务的返回结果
# t_list.append(res)
# #
# # pool.shutdown() # 关闭池子,等待池子中所有的任务执行完毕之后,才会往下运行代码
# # print(t_list)
# # for p in t_list:
# # print('>>>:',p.result())
### 最终版本
if __name__ == '__main__':
for i in range(5):
res = pool.submit(task,i).add_done_callback(call_back)
二、协程
完全是程序员自己想出来的名词,单线程下实现并发(并发:切换+保存状态)
进程、线程、协程之间区别:
进程:资源单位
线程:执行单位
协程:单线程下实现并发
'''
gevent模块
'''
from gevent import monkey;monkey.patch_all() # 由于该模块经常被使用,建议写成一行
from gevent import spawn
import time
'''
注意gevent模块没办法自动识别time.sleep等io情况
需要手动再配置一个参数
'''
def heng():
print("哼")
time.sleep(2)
print('哼')
def ha():
print('哈')
time.sleep(3)
print('哈')
def heiheihei():
print('嘿嘿嘿')
time.sleep(5)
print('嘿嘿嘿')
start = time.time()
g1 = spawn(heng)
g2 = spawn(ha) # spawn 会检测所有的任务
g3 = spawn(heiheihei)
g1.join()
g2.join()
g3.join()
print(time.time()-start)
