协程和异步io
一,并发,并行,同步,异步,阻塞,非阻塞
并发
:并发是指一个时间段内,有几个程序在同一个 cpu 上运行,但是任意时刻是由一个程序运行(在io等待的时间去运行别的程序)
并行
:并行是指任意时刻点上,有多个程序同时运行在多个 cpu 上
同步
:代码调用 I/O 操作时,必须等待 I/O 操作完成才返回的调用方式
异步
:代码调用 I/O 操作时,不必等待 I/O 操作完成就返回调用方式
阻塞
:调用函数时候当前线程被挂起
非租塞
:调用函数时候当前线程不会被挂起,而是立即返回
二,C10k问题和I/O多路复用(select, poll, epoll)
-
阻塞式 I/O(最开始都是阻塞式I/O)
-
非阻塞式 I/O
-
I/O 多路复用
-
信号驱动式 I/O(用的非常少)
-
异步 I/O
-
epoll 并不一定比 select 好
-
在高并发的情况下,连接活跃度不是很高,epoll 比 select 好(网站,需要高并发)
-
并发性不高,同时链接很活跃,select 比 epoll 好(游戏)
三,select + 回调 + 事件循环获取html
四,回调之痛
五,协程是什么
-
C10M问题
-
协程
def get_html(url): # do something html = get_html(url) # 此处暂停,切换到另一个函数去执行 # parse url urls = parse_url(html) def get_html(url): # do something html = get_html(url) # 此处暂停,切换到另一个函数去执行 # parse url urls = parse_url(html) # 传统函数调用,过程:A -> B -> C # 我们需要一个可以暂停的函数,并且可以在适当的时候恢复该函数的继续执行 # 出现了协程 --> 有多个入口的函数,可以暂停的函数(可以向暂停的地方传入值)