线程、协成、IO模型
1、线程就是CPU调度的最小单位。
2、 # 线程进程之间的对比
# 线程不能独立存在,必须在一个进程里 # 线程的开启 关闭以及切换的开销要远远小于进程
import time from threading import Thread from multiprocessing import Process def func(i):i += 1 if __name__ == '__main__':start_time = time.time()t_l = []for i in range(50):t = Thread(target=func, args=(i,))t.start()t_l.append(t)for t in t_l:t.join()print('主线程')print(time.time() - start_time) if __name__ == '__main__':start_time = time.time()p_l = []for i in range(50):p = Process(target=func, args=(i,))p.start()p_l.append(t)for p in t_l:p.join()print('主进程')print(time.time() - start_time)
3、 # 同一个进程之间的多个线程之间数据共享 # 全局解释器锁GIL # 使得一个进程中的多个线程不能充分的利用多核 # 这个锁能保证同一时刻只有一个线程运行 4、
# 主线程如果结束了 那么整个进程就结束# 守护线程 会等待主线程结束之后才结束. # 主进程 等待 守护进程 子进程 # 守护进程 只守护主进程的代码就可以了 # 守护线程不行 主线程如果结束了 那么整个进程就结束 所有的线程就都结束
import time from threading import Thread def thread1():while True:print(True)time.sleep(0.5)def thread2():print('in t2 start')time.sleep(3)print('in t2 end')if __name__ == '__main__':t1 = Thread(target=thread1)t1.setDaemon(True)t1.start()t2 = Thread(target=thread2)t2.start()time.sleep(1)print('主线程')
# 线程池 # concurrent.futures.ThreadPoolExecutor # 线程池对象.map(func,iterable) # 线程池对象.submit 异步提交 # 线程池对象.shutdown ==>close+join # 任务对象.result # 任务对象.add_done_callback 回调函数都是在子线程执行# 进程池 # concurrent.futures.ProcessPoolExecutor # 任务对象.add_done_callback 回调函数都是在主进程执行# 协程 # 在一个线程内的多个任务之间能够互相切换 # 这个切换不是操作系统级别的 都是用户控制的 # 最简单的切换以及状态的保留使用python原生的语法yield其实就可以实现 # 但是一般情况下我们都是用gevent来完成协程的工作 # 它能够帮助我们规避IO操作 # 它内部使用的协程机制是greenlet # 协程比起线程的好处 # 充分的利用了一条线程来提高CPU的工作效率 # 不存在数据不安全的问题 # join() 在主线程中没有其他阻塞事件的时候就是用join来保证协程任务都能顺利的执行完 # spawn() 发起一个协程任务 IO 模型
# IO多路复用 - 操作系统提供的# 1.程序不能干预过程# 2.操作系统之间的差异import selectimport socket sk = socket.socket()sk.bind(('127.0.0.1',9090))sk.listen()sk.setblocking(False)rlst = [sk]while True: rl,wl,xl = select.select(rlst,[],[]) #[sk,conn1,conn2] # 为什么突然把sk返回回来了? sk对象有数据可以被读了 # 为什么返回三个列表? 读事件的列表 写事件的列表 条件的列表 # 为什么是列表? 有可能同时有多个被监听的对象发生读时间 for obj in rl: if obj is sk: # is的意思更精准,判断的是obj就是sk conn,addr = obj.accept() rlst.append(conn) else: try: ret = obj.recv(1024) print(ret) obj.send(b'hello') except ConnectionResetError: obj.close() rlst.remove(obj) # TCP协议来说,如果对方关闭了连接# 另一方有可能继续 接收 空消息 或者 报错 # 背代码# 将具体的情况套到代码中 将逻辑理顺# 理解之前IO多路复用的那张图 # 什么叫IO多路复用 # io多路复用是操作系统提供的一种 监听 网络IO操作的机制 # 监听三个列表 # 当某一个列表有对应的事件发生的时候 # 操作系统通知应用程序 # 操作系统根据返回的内容做具体的操作# 对于只有一个对象需要监听的情况 IO多路复用并无法发挥作用# 对于并发接收网络请求的应用场景 IO多路复用可以帮助你在节省CPU利用率和操作系统调用的基础上完成并发需求 # IO多路复用 # select 是windows上的机制 轮询的方式来监听每一个对象是否有对应的事件发生的,数据越多延迟越大 # 能够处理的对象数是有限的 # poll linux 和select的机制基本一致,对底层存储被监听对象的数据结构做了优化 # 能够处理的对象个数增加了 # epoll linux 采用了回调函数的方式来通知应用被监听的对象有事件发生了
转载于:https://www.cnblogs.com/zhaosijia/p/9391922.html
线程、协成、IO模型相关推荐
- 【转】5.2高性能IO模型浅析
服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...
- IO模型、IO多路复用
IO多路复用 基础概述 用户空间和内核空间 PIO与DMA 缓存IO和直接IO 缓存IO 优点 缺点 直接IO IO访问方式 磁盘IO 网络IO 磁盘IO和网络IO对比 Socket网络编程 客户端 ...
- 高性能IO模型浅析--范志东(Florian)
代码改变世界 Posts - 74, Articles - 4, Comments - 439 Cnblogs Dashboard Login Home Contact Gallery RSS Flo ...
- python(40)- 进程、线程、协程及IO模型
一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...
- 5,线程池,进程池,协程,IO模型
今日内容: 1,线程池 2,进程池 3,协程 4,IO 模型 服务端要满足这三个条件: 1,24小时不间断的提供服务 2,能够支持高并发 3,要有固定的IP地址和端口在服务端这个地方会出现阻塞态情况: ...
- JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....
关于Java面试,面试官一般喜欢问哪些问题? 本文对一些高频问题做了汇总,为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于 JAVA 接下来,我们逐条来看看每个问题及答案 JDK. ...
- 线程/协程/异步的编程模型(CPU利用率为核心)
最近看了一个b站博主的视频https://www.bilibili.com/video/av64066246/讲到了线程/协程/异步的编程模型,这里做下记录 1.线程 上篇文章有聊到进程和线程的关系, ...
- Redis高效性探索--线程IO模型,通信协议
Redis线程IO模型 Redis是单线程,这个毋庸置疑 Redis单线程能做到这么高的效率?不用怀疑,还有很多其他的服务都是单线程但是也有超高的效率,比如Node.js,Nginx也是单线程. Re ...
- JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...
JDK.JRE.JVM 三者有什么关系? 答案: JDK(全称 Java Development Kit),Java开发工具包,能独立创建.编译.运行程序. JDK = JRE + java开发工具( ...
最新文章
- Java设计模式(七大原则和单例模式篇)
- C++ 控制结构和函数(二) —— 函数I(Functions I)
- Linux命令 umask,chmod使用
- Tomcat配置可以访问外部资源路径
- C语言如何交换两个数(位运算)
- laravel 5.2 Auth用户认证教程
- 在android系统中开发DLNA
- gridview中手工排序
- https://blog.csdn.net/gyming/article/details/46611369
- 关于我国高等数学教材的版权发财户
- Qt编写可视化大屏电子看板系统17-柱状堆积图
- matlab中的textscan函数
- 30分钟看懂经济机器是如何运行的?
- 思科 Spanning Tree Protocol(STP)生成树
- 零跑股价再度上涨的原因到底是什么呢?
- 取消notepad++打开.bat文件
- c语言的简单的分数求和
- 赵小楼《天道》《遥远的救世主》深度解析(56)芮小丹的“精神绝症”和“心之地狱”
- QT5简易音乐播放器的设计
- 学计算机专业用什么u盘,介绍几款比较不错的U盘品牌-电脑自学网
热门文章
- 问题与解答 [Questions Answers]
- 基于visual Studio2013解决C语言竞赛题之0502最小数替换
- 页面回传与js调用服务器端事件(转)
- 《模式识别与机器学习》学习笔记:2.2 多项变量
- linux ntp同步日志,Linux使用入门教程之Rsyslog日志管理、NTP和Rsync备份同步
- java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...
- 简单约瑟夫环问题解法汇总(模拟/数论)
- 小于n与n互质的所有数的和(欧拉函数+快速幂)
- 一文读懂阿里云数据库Autoscaling是如何工作的
- 阿里云伯俊软件:强强联合,共建新生态