协程、IO模型

一、协程

1.定义:

  单线程实现并发,可以再应用程序当中控制多个任务的切换+保存状态。

  优点:在应用程序级别的速度要远远高于操作系统的切换

  缺点:多个任务一旦有一个任务阻塞住了,没有及时切换,整个线程都将阻塞在原地,该线程内的其他任务都不能继续执行了。

所以,在引入协程之后,就需要检测单线程下所有的IO行为,必须实现一旦遇到IO就立即切换,少一个都不行,因为一旦遇到一个任务阻塞住了,其它的任务都将阻塞住,及时其余的线程都是可以计算的,它们也是无法继续执行了。

2.协程的目的

  程序想要能够在单线程下实现并发,并发即指的是多个任务看起来是同时执行的。

  协程的并发=切换+保存运行暂停时的状态

二、IO模型

分类:阻塞IO ( blocking IO)

  非阻塞IO( nonblocking IO)

  IO多路复用( IO multiplexing)

  异步IO( asynchronous IO)

  IO发生时涉及的对象和步骤:

  对于一个network IO (这里我们以read举例),它会涉及到两个系统对象,一个是调用这个IO的process (or thread),另一个就是系统内核(kernel)。当一个read操作发生时,该操作会经历两个阶段。

#1 等待数据准备 (Waiting for the data to be ready)
#2 将数据从内核拷贝到进程中(Copying the data from the kernel to the process)

1.阻塞IO

待更。。。

原文地址:https://www.cnblogs.com/Smart1san/p/9325696.html

时间: 2024-11-09 06:21:39

协程、IO模型的相关文章

python_day10 多线程 协程 IO模型

多线程协程IO模型 多线程 #线程的PID与主进程PID一致 from threading import Thread from multiprocessing import Process import os def task(): print('%s is running' %os.getpid()) if __name__ == '__main__': t1=Thread(target=task,) t2=Thread(target=task,) # t1=Process(target=t

Http协议和IO模型

HTTP 协议和IO模型 一:HTTP协议 http协议:HyperText Transfer Procotol超文本传输协议,http协议是无状态的,监听在80端口,TCP协议上.HTTP协议的特点有以下几点: 1.支持客户/服务器模式.2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径.请求方法常用的有GET.HEAD.POST.每种方法规定了客户与服务器联系的类型不同.由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快.3.灵活:HTTP允许传输任意类型的数据

# 进程/线程/协程 # IO:同步/异步/阻塞/非阻塞 # greenlet gevent # 事件驱动与异步IO # Select\Poll\Epoll异步IO 以及selectors模块 # Python队列/RabbitMQ队列

1 # 进程/线程/协程 2 # IO:同步/异步/阻塞/非阻塞 3 # greenlet gevent 4 # 事件驱动与异步IO 5 # Select\Poll\Epoll异步IO 以及selectors模块 6 # Python队列/RabbitMQ队列 7 8 ############################################################################################## 9 1.什么是进程?进程和程序之间有什么

协程/IO多路复用

一.协程: 概念:是一个比线程更加轻量级的单位,是组成线程的各个函数 为什么要有协程: 想要在单线程内实现并发的效果.但因为Cpython有GIL锁,限制了在同一时间点,CPU只能执行一个线程,所以想要在执行一个线程的期间,充分利用cpu的性能,所以才有了想在单线程内实现并发的效果 cpu 为什么要切换: 1.因为某个程序阻塞 2.因为某个程序用完了时间片 很明显,解决1 这个问题才能提高效率 所以想要实现单线程的并发,就要解决在单线程中,多个任务函数中,某个任务函数遇见IO操作,马上自动切换到

python协程io自动切换--gevent

1.gevent执行 import gevent def func1(): print('func1 start') gevent.sleep(2) print('func1 end') def func2(): print('func2 start') gevent.sleep(1) print('func2 end') def func3(): print('func3 start') gevent.sleep(0) print('func3 end') if __name__=='__ma

python进程、线程、协程、IO多路复用

线程进程介绍 工作最小单元是线程 应用程序 -> 至少有一个进程 -> 至少有一个线程 应用场景: IO密集型:线程 计算密集型:进程 4. GIL,全局解释器锁. 保证同一个进程中只有一个线程同时被调度 线程 1. 基本使用 def task(arg): time.sleep(arg) print(arg) for i in range(5): t = threading.Thread(target=task,args=[i,]) # t.setDaemon(True) # 主线程终止,不等

谈谈对协程的理解

什么是协程 协程是在线程之上由“用户”构建的并发单元,对OS来说无感知,协程的切换由用户自己管理和调度.(这里的用户是相较于内核而言的,一些通用库这里也理解为用户) C/C++怎么实现协程 作为一个C++后台开发,我知道像go, lua之类的语言在语言层面上提供了协程的api,但是我比较关心C++下要怎么实现这一点,下面的讨论都是从C/C++程序员的角度来看协程的问题的. boost和腾讯都推出了相关的库,语言层面没有提供这个东西.我近期阅读了微信开源的libco协程库,协程核心要解决几个问题:

No.36协程

No.36 今日概要 协程 gevent模块 asyncio模块 内容回顾 1.锁 互斥锁 一把锁不能在一个线程中连续acquire 开销小 递归锁 一把锁可以在一个线程中连续acquire多次,acquire多少次就release多少次. 开销大 死锁现象 在线程中陷入阻塞并且永远无法结束阻塞的情况 形成原因 多把锁 + 交替使用 互斥锁在一个线程中连续acquire 避免死锁 在一个线程中只用一把锁,并且每一次acquire之后都要release. 线程中导致数据不安全的情况 += .-=

状态机/迭代器/LINQ/协程

状态机 有限状态机(Finite State Machine 或 Finite State Automata)是软件领域中一种重要的工具. 状态机允许一个对象在其内部状态改变时改变它的行为.对象内部状态决定行为方式,对象状态改变行为方式改变,这里强调内部状态. Command 模式是将命令请求封装成一个为对象,将不同的请求对象参数化以达到同样的调用执行不同的命令: State 模式是将对象的状态封装成一个对象,是在不同的状态下同样的调用执行不同的操作. 迭代器是一个典型的状态机例子,后续会讲解.

Python_oldboy_自动化运维之路_线程,进程,协程(十一)

本节内容: 线程 进程 协程 IO多路复用 自定义异步非阻塞的框架 线程和进程的介绍: 举个例子,拿甄嬛传举列线程和进程的关系: 总结:1.工作最小单元是线程,进程说白了就是提供资源的 2.一个应用程序至少有一个进程,一个进程里至少有一个线程 3.应用场景:io密集型适合用多线程,计算密集型(cpu)适合用多进程 4.GIL:全局解释器锁,作用:保证同一个进程中只能有一个线程同时被调用 5.python的一个诟病:前提是被cpu调度,因为有GIL,一个应用只有一个进程,纵容有多个线程,也体现不出