python3 coroutine

最近用了Django的django channels2.0,发现这个东西是支持websocket的。于是经过一段时间,我已经实现在Django工程上实现websocket的处理。然后看了django channels的源码,看到了熟悉的async,于是就开始一段coroutine的学习。

1 yield from iterator

首先看下 yield from iterator这个东西。我们都知道yield算是返回一个迭代器,fibonacci数列求值用这个最好,时间复杂度是O(1),大学的时候一直都在去研究更快的算法,无奈我从来就没有用C和Java实现过,当时也不知道有yield这种用法。

那么yield from iterator就代表:

for x in iterator:  
    yield x  

2事件循环

  关于事件循环的一个解释,以下来自:事件循环 

 让我们回到维基百科,事件循环是“在程序中等待、分发事件或消息的编程结构”。简而言之,事件循环的作用是,“当A发生后,执行B”。最简单的例子可能是每个浏览器中都有的JavaScript事件循环,当你点击网页某处("当A发生后"),点击事件被传递给JavaScript的事件循环,然后事件循环检查网页上该位置是否有注册了处理这次点击事件的onclick回调函数("执行B")。如果注册了回调函数,那么回调函数就会接收点击事件的详细信息,被调用执行。事件循环会不停的收集发生的事件,循环已注册的事件操作来找到对应的操作,因此被称为“循环”。Python标准库中的asyncio库可以提供事件循环。asyncio在网络编程里的一个重要应用场景,就是以连接到socket的I/O准备好读/写(通过selector模块实现)事件作为事件循环中的“当A发生后”事件。除了GUI和I/O,事件循环也经常在执行多线程或多进程代码时充当调度器(例如协同式多任务处理)。如果你知道Python中的GIL(General Interpreter Lock),事件循环在规避GIL限制方面也有很大的作用。

 

后续更新

posted on 2018-05-07 21:06  费晓晖  阅读(139)  评论(0编辑  收藏  举报