Python 高级编程和异步IO并发编程 --12_5 协程是什么

C10M问题:如何利用8核CPU,64G内存,在10Gbps的网络上保持1000万并发连接

回调模式:如何在单线程中实现并发

1- 回调模式编码复杂度高

2- 同步编程的并发性不高

3- 多线程编程需要线程间同步,Lock

协程:为了解决回调编写难的问题。

1- 用同步的方式去去编写异步的代码

2- 采用单线程去切换任务:带来的挑战

1> 线程是由操作系统切换的,单线程切换意味着我们需要程序员自己去调度任务

2> 不再需要锁,并发性高,如果在单线程内切换函数,性能远高于线程切换,并发性更高。

协程:有多个入口的函数/可以暂停的函数(可以向暂停的地方传入值)。生成器恰好是这样的函数

def get_url(url):    # 传统方法
    # do something 1      # 消耗CPU,可以运行
    html = get_html(url)  # 该步执行较慢,获取网页。 希望此处调用后就暂停,切换到另一个函数去执行。 此处消耗io,在消耗io的地方希望等待,
    # 等待io执行完毕后,回来继续执行该函数。
    # parsel html  # 获取html后解析
    urls = parse_url(html)

def get_usl2():
    # do something 1      # 消耗CPU,可以运行
    html = get_html(url)  # 该步执行较慢,获取网页。 希望此处调用后就暂停,切换到另一个函数去执行。 此处消耗io,在消耗io的地方希望等待,
    # 等待io执行完毕后,回来继续执行该函数。
    # parsel html  # 获取html后解析
    urls = parse_url(html)

# 传统函数调用过程:A->B->C,每个函数调用都有一个栈,函数运行一次后会退出,退出之后函数就没有关系了。
# 如果采用传统编程模式,线程一旦被执行,必须要的等到其返回为止。
# 线程是由操作系统切换的,单线程切换意味着我们需要程序员自己去调度任务,这意味着如果采用传统编程模式,“html = get_html(url)”
# 语句执行后会阻塞,一直等待,此时CPU就会停在那里。 现在期望的结果是,调用“html = get_html(url)”之后,函数get_url()暂停,
# 切换到另一个函数去执行
# 此时,就提出了一个调整,如何由函数get_url()切换到get_url2()? 我们就需要一个可以暂停的函数,并且可以在适当的时候,恢复该函数的继续执行。
# 如果存在,就可以满足“1- 用同步的方式去去编写异步的代码” 与 “2- 采用单线程去切换任务” 这两个条件。
# 为了解决这个问题,就出现了协程。
# 协程:有多个入口的函数/可以暂停的函数(可以向暂停的地方传入值)。
# “html = get_html(url)”暂停,恢复的时候希望可用把html传递回来;载停时,抛出去一个任务,恢复时,就需要返回html的值。该值是由外部函数执行得到的。
# 传统函数调用栈
# 生成器,恰好是可用暂停的函数。
发布了380 篇原创文章 · 获赞 129 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/f2157120/article/details/105180234