python3 coroutine
Posted feixiaohuijava
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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限制方面也有很大的作用。
后续更新
以上是关于python3 coroutine的主要内容,如果未能解决你的问题,请参考以下文章