进程池与线程池
一、进程池与线程池
什么是池
在保证计算机硬件不会崩溃的情况下,尽可能多的开设进程与线程。
虽然降低了运行效率,但是保证了计算机硬件的安全。
进程池
进程池:提前开设了固定个数的进程 之后反复调用这些进程完成工作(后续不再开设新的)
线程池
线程池:提前开设了固定个数的线程 之后反复调用这些线程完成工作(后续不再开设新的)
二、在python中创建进程池与线程池
import time
from concurrent.futures import ProcessPoolExecutor
from concurrent.futures import ThreadPoolExecutor
import os
def test(n):
res = 1
for i in range(n):
res += i
time.sleep(1)
# print(res)
return res
A = ProcessPoolExecutor()
B = ThreadPoolExecutor()
# print(os.cpu_count())
if __name__ == '__main__':
r_list = []
for i in range(100):
# ret = A.submit(test, i) # 多进程异步提交任务,得到一个返回值
ret = B.submit(test, i) # 多线程异步提交任务,得到一个返回值
r_list.append(ret)
for i in r_list: # 等所有线程任务结束后
print(i.result()) # 打印返回值的结果,该过程是同步的
print('主')
from concurrent.futures import ThreadPoolExecutor, ProcessPoolExecutor
import time
import os
# 创建进程池与线程池
# pool = ThreadPoolExecutor(5) # 可以自定义线程数 也可以采用默认策略
pool = ProcessPoolExecutor(5) # 可以自定义线程数 也可以采用默认策略
# 定义一个任务
def task(n):
print(n, os.getpid())
time.sleep(2)
return '>>>:%s' % n ** 2
# 定义一个回调函数:异步提交完之后有结果自动调用该函数
def call_back(a):
print('异步回调函数:%s' % a.result())
# 朝线程池中提交任务
# obj_list = []
for i in range(20):
res = pool.submit(task, i).add_done_callback(call_back) # 异步提交
三、IO模型简介
io模型类型
① blocking IO (阻塞IO)
② nonblocking IO (非阻塞IO)
③ IO multiplexing (IO多路复用)
④ signal driven IO (信号驱动IO)
⑤ asynchronous IO (异步IO)
常用的四种IO模型
阻塞IO:最为常见的一种IO模型 有两个等待的阶段(wait for data、copy data)
非阻塞IO: 系统调用阶段变为了非阻塞(轮训) 有一个等待的阶段(copy data) 轮询的阶段是比较消耗资源的
多路复用IO:利用select或者epoll来监管多个程序 一旦某个程序需要的数据存在于内存中了 那么立刻通知该程序去取即可
异步IO:只需要发起一次系统调用 之后无需频繁发送 有结果并准备好之后会通过异步回调机制反馈给调用者


浙公网安备 33010602011771号