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模型相关推荐

  1. 【转】5.2高性能IO模型浅析

    服务器端编程经常需要构造高性能的IO模型,常见的IO模型有四种: (1)同步阻塞IO(Blocking IO):即传统的IO模型. (2)同步非阻塞IO(Non-blocking IO):默认创建的s ...

  2. IO模型、IO多路复用

    IO多路复用 基础概述 用户空间和内核空间 PIO与DMA 缓存IO和直接IO 缓存IO 优点 缺点 直接IO IO访问方式 磁盘IO 网络IO 磁盘IO和网络IO对比 Socket网络编程 客户端 ...

  3. 高性能IO模型浅析--范志东(Florian)

    代码改变世界 Posts - 74, Articles - 4, Comments - 439 Cnblogs Dashboard Login Home Contact Gallery RSS Flo ...

  4. python(40)- 进程、线程、协程及IO模型

    一.操作系统概念 操作系统位于底层硬件与应用软件之间的一层.工作方式:向下管理硬件,向上提供接口. 操作系统进行进程切换:1.出现IO操作:2.固定时间. 固定时间很短,人感受不到.每一个应用层运行起 ...

  5. 5,线程池,进程池,协程,IO模型

    今日内容: 1,线程池 2,进程池 3,协程 4,IO 模型 服务端要满足这三个条件: 1,24小时不间断的提供服务 2,能够支持高并发 3,要有固定的IP地址和端口在服务端这个地方会出现阻塞态情况: ...

  6. JAVA那点破事!并发、IO模型、集合、线程池、死锁、非阻塞、AQS....

    关于Java面试,面试官一般喜欢问哪些问题? 本文对一些高频问题做了汇总,为了便于大家查找问题,了解全貌,整理个目录,我们可以快速全局了解关于 JAVA 接下来,我们逐条来看看每个问题及答案 JDK. ...

  7. 线程/协程/异步的编程模型(CPU利用率为核心)

    最近看了一个b站博主的视频https://www.bilibili.com/video/av64066246/讲到了线程/协程/异步的编程模型,这里做下记录 1.线程 上篇文章有聊到进程和线程的关系, ...

  8. Redis高效性探索--线程IO模型,通信协议

    Redis线程IO模型 Redis是单线程,这个毋庸置疑 Redis单线程能做到这么高的效率?不用怀疑,还有很多其他的服务都是单线程但是也有超高的效率,比如Node.js,Nginx也是单线程. Re ...

  9. JAVA那点破事,并发、IO模型、集合、线程池、死锁、非阻塞、AQS...

    JDK.JRE.JVM 三者有什么关系? 答案: JDK(全称 Java Development Kit),Java开发工具包,能独立创建.编译.运行程序. JDK = JRE + java开发工具( ...

最新文章

  1. Java设计模式(七大原则和单例模式篇)
  2. C++ 控制结构和函数(二) —— 函数I(Functions I)
  3. Linux命令 umask,chmod使用
  4. Tomcat配置可以访问外部资源路径
  5. C语言如何交换两个数(位运算)
  6. laravel 5.2 Auth用户认证教程
  7. 在android系统中开发DLNA
  8. gridview中手工排序
  9. https://blog.csdn.net/gyming/article/details/46611369
  10. 关于我国高等数学教材的版权发财户
  11. Qt编写可视化大屏电子看板系统17-柱状堆积图
  12. matlab中的textscan函数
  13. 30分钟看懂经济机器是如何运行的?
  14. 思科 Spanning Tree Protocol(STP)生成树
  15. 零跑股价再度上涨的原因到底是什么呢?
  16. 取消notepad++打开.bat文件
  17. c语言的简单的分数求和
  18. 赵小楼《天道》《遥远的救世主》深度解析(56)芮小丹的“精神绝症”和“心之地狱”
  19. QT5简易音乐播放器的设计
  20. 学计算机专业用什么u盘,介绍几款比较不错的U盘品牌-电脑自学网

热门文章

  1. 问题与解答 [Questions Answers]
  2. 基于visual Studio2013解决C语言竞赛题之0502最小数替换
  3. 页面回传与js调用服务器端事件(转)
  4. 《模式识别与机器学习》学习笔记:2.2 多项变量
  5. linux ntp同步日志,Linux使用入门教程之Rsyslog日志管理、NTP和Rsync备份同步
  6. java 3 9 2 6数字排序_GitHub - JourWon/sort-algorithm: 史上最全经典排序算法总结(Java实现)...
  7. 简单约瑟夫环问题解法汇总(模拟/数论)
  8. 小于n与n互质的所有数的和(欧拉函数+快速幂)
  9. 一文读懂阿里云数据库Autoscaling是如何工作的
  10. 阿里云伯俊软件:强强联合,共建新生态