进程池与线程池

一、进程池与线程池

    什么是池

      在保证计算机硬件不会崩溃的情况下,尽可能多的开设进程与线程。

      虽然降低了运行效率,但是保证了计算机硬件的安全。

    进程池      

      进程池:提前开设了固定个数的进程 之后反复调用这些进程完成工作(后续不再开设新的)      

    线程池

       线程池:提前开设了固定个数的线程 之后反复调用这些线程完成工作(后续不再开设新的)

二、在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:只需要发起一次系统调用 之后无需频繁发送 有结果并准备好之后会通过异步回调机制反馈给调用者

 

posted @ 2022-01-17 17:34  椰子皮0oo0  阅读(39)  评论(0)    收藏  举报
1