进程池、线程池:

开进程池和线程池都是要消耗资源的,只不过比较而言消耗的资源进程池多一点,线程池少一点

就是在计算机硬件能承受的最大范围内去利用计算机。

什么是池?

就是在保证计算机硬件安全的情况最大利用计算机。

因为计算机硬件的发展跟不上软件的速度。

作用:

1.自动管理了进程/线程的开启和销毁

2.自动管理分配任务

3.限制了进程/线程的创建数量,信号量只是限制了最大并发线程访问数量,线程已经创建了。

就是可以对线程/进程进行回收,

池子中创建的进程/线程创建一次就不会再创建了
从始至终使用都是那几个,这样就节省了开启线程进程的资源

使用:

submint()是提交任务

pool.shutdown() # 等待所有任务全部完毕 销毁所有线程 后关闭线程池

def task(n):print(n,os.getpid())  # 查看当前进程号time.sleep(2)return n**2def call_back(n):print('拿到了异步提交任务的返回结果:',n.result())
"""
提交任务的方式同步:提交任务之后 原地等待任务的返回结果 期间不做任何事异步:提交任务之后 不等待任务的返回结果(异步的结果怎么拿???) 直接执行下一行代码
"""# pool.submit(task,1)  # 朝线程池中提交任务   异步提交
# print('主')
"""
异步回调机制:当异步提交的任务有返回结果之后,会自动触发回调函数的执行"""
if __name__ == '__main__':t_list = []for i in range(20):res = pool.submit(task,i).add_done_callback(call_back)  # 提交任务的时候 绑定一个回调函数 一旦该任务有结果 立刻执行对于的回调函数# print(res.result())  # 原地等待任务的返回结果
        t_list.append(res)# pool.shutdown()  # 关闭池子 等待池子中所有的任务执行完毕之后 才会往下运行代码# for p in t_list:#     print('>>>:',p.result())

View Code

协程:

就是单线程下实现并发。

也叫轻量级线程。

并发:就是看上去是并行,其实是切换加保存执行

并行:就是真正意义上的同时进行。

IO密集用多线程

计算密集用多进程

首先我们可以使用生成器完成并发执行

def task1():while True:yieldprint("task1 run")def task2():g = task1()while True:next(g)print("task2 run")
task2()

优点:协程的创建开销更小,属于程序级别的,操作系统完全感知不到。

   单线程下就能实现并发执行,最大限度使用cpu

gevent模块:

import gevent,sys
from gevent import monkey # 导入monkey补丁
monkey.patch_all() # 打补丁
import timeprint(sys.path)def task1():print("task1 run")# gevent.sleep(3)time.sleep(3)print("task1 over")def task2():print("task2 run")# gevent.sleep(1)time.sleep(1)print("task2 over")g1 = gevent.spawn(task1)
g2 = gevent.spawn(task2)
#gevent.joinall([g1,g2])
g1.join()
g2.join()

如果没有join的话,执行以上代码不会有任何信息,因为协程的任务都是以异步的方式提交的,所以主线程会继续执行代码,直到运行完最后一行便会结束主进程。这就导致了协程的任务没有及时执行,所以这个时候我们要用join来保证协程内的代码执行完毕后才会执行主线程,当然如果主线程不会结束那么也就不需要调用join。

注意:

1.如果主线程结束了 协程任务也会立即结束。

2.monkey补丁的原理是把原始的阻塞方法替换为修改后的非阻塞方法,即偷梁换柱,来实现IO自动切换

必须在打补丁后再使用相应的功能,避免忘记,建议写在最上方

IO模型:

总共有五种IO:

blocking IO           阻塞IO
nonblocking IO      非阻塞IO
IO multiplexing      IO多路复用
signal driven IO     信号驱动IO
asynchronous IO    异步IO

阻塞IO:

 在linux中,默认情况下所有的socket都是blocking,一个典型的读操作流程大概是这样:

非阻塞IO:

Linux下,可以通过设置socket使其变为non-blocking。当对一个non-blocking socket执行读操作时,流程是这个样子:

  

IO多路复用:

IO multiplexing这个词可能有点陌生,但是如果我说select/epoll,大概就都能明白了。有些地方也称这种IO方式为事件驱动IO(event driven IO)。我们都知道,select/epoll的好处就在于单个process就可以同时处理多个网络连接的IO。它的基本原理就是select/epoll这个function会不断的轮询所负责的所有socket,当某个socket有数据到达了,就通知用户进程。它的流程如图:

异步IO(ASYN开头的):

Linux下的asynchronous IO其实用得不多,从内核2.6版本才开始引入。先看一下它的流程:

转载于:https://www.cnblogs.com/xinfan1/p/11358158.html

进程池和线程池,协程,IO多路复用相关推荐

  1. Python之路--协程/IO多路复用

    引子: 之前学习过了,线程,进程的概念,知道了在操作系统中进程是资源分配的最小单位,线程是CPU调度的最小单位.按道理来说我们已经算是把CPU的利用率提高很多了.但是我们知道无论是创建多进程还是创建多 ...

  2. python线程池模块_python并发编程之进程池,线程池,协程

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  3. 进程池、线程池、回调函数、协程

    阅读目录 摘要: 进程池与线程池 同步调用和异步调用 回调函数 协程 一.进程池与线程池: 1.池的概念: 不管是线程还是进程,都不能无限制的开下去,总会消耗和占用资源. 也就是说,硬件的承载能力是有 ...

  4. Python 37 进程池与线程池 、 协程

    一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...

  5. python线程池模块_python并发编程之进程池,线程池,协程(Python标准模块--concurrent.futures(并发未来))...

    需要注意一下 不能无限的开进程,不能无限的开线程 最常用的就是开进程池,开线程池.其中回调函数非常重要 回调函数其实可以作为一种编程思想,谁好了谁就去掉 只要你用并发,就会有锁的问题,但是你不能一直去 ...

  6. 并发编程之进程池,线程池 和 异步回调,协程

    1.进程池和线程池 2.异步回调 3.协程 4.基于TCP使用多线程实现高并发 一.进程池和线程池 什么是进程池和线程池: ''' 池 Pool 指的是一个容器 线程池就是用来存储线程对象的 容器创建 ...

  7. python协程池_python3下multiprocessing、threading和gevent性能对比—-暨进程池、线程池和协程池性能对比 | 学步园...

    目前计算机程序一般会遇到两类I/O:硬盘I/O和网络I/O.我就针对网络I/O的场景分析下python3下进程.线程.协程效率的对比.进程采用multiprocessing.Pool进程池,线程是自己 ...

  8. 0820Python总结-线程队列,进程池和线程池,回调函数,协程

    一.线程队列 from queue import Queue put 存 get 取 put_nowait 存,超出了队列长度,报错 get_nowait 取,没数据时,直接报错 Linux Wind ...

  9. python-进程池与线程池,协程

    一.进程池与线程池 实现并发的手段有两种,多线程和多进程.注:并发是指多个任务看起来是同时运行的.主要是切换+保存状态. 当我们需要执行的并发任务大于cpu的核数时,我们需要知道一个操作系统不能无限的 ...

最新文章

  1. 【视频】React redux toolkit创建状态切片
  2. 一个专业搜索公司关于lucene+solar资料
  3. Notepad++中用正则表达式匹配中文
  4. linux mysql select_MySQL-Select语句高级应用
  5. (75)Xilinx Slice组成结构有哪些?
  6. 夹娃娃_夹娃娃的实用性方法 抓娃娃可以用什么技巧
  7. arduino支持的内核版本_Arduino开发(arduino IDE)
  8. Vue3学习之第一节:初识setup
  9. 加载等待loading
  10. 联想重装系统去掉保护_如何去掉联想硬盘保护系统?
  11. 软考高级可以作为高级职称直接落户上海吗?
  12. eclipse jdt
  13. 电脑配置低用不了PS怎么办?你需要网页版ps!
  14. 求助FC上的一个c++代码实现丧心病狂的走迷宫小游戏!
  15. 使用canal1.1.5让MySQL5.7同步到ES7.x
  16. 3.1 Caffe最优求解过程
  17. 20210318 东南大学电气工程学院毕业分布--可视化地图
  18. “0x00000014”内存。该内存不能为“Written”(或“Read”)的解决办法。
  19. 爪爪博士:什么是猫艾滋病?猫艾滋病是一种猫免疫缺陷病
  20. 如何查看Win10电脑是否能运行Hyper-V虚拟机

热门文章

  1. 【JSOI2014】【BZOJ5039】序列维护(线段树模板)
  2. mysql truncate 授权_Oracle给用户授权truncatetable的实现方案
  3. android gettext方法,方法getText()必须从UI线程(Android Studio)调用
  4. Unity3D基础11:Rigidbody物理类组件
  5. bzoj 1682: [Usaco2005 Mar]Out of Hay 干草危机(最小生成树)
  6. ubuntu14.04安装tensorflow-gpu
  7. Reference to a cleared variable I1
  8. opencv 图像傅里叶变换
  9. Druid 简介,架构,部署,python连接,hue链接druid
  10. 安卓中fragment的使用全解