只用 Python 的 yield 关键字, 实现一个协程, 或者说用户态函数(生成器)调度

2017-10-28 22:38:19 +08:00
 petelin
关于协程 sleep 实现想了好久, idea 来源于 Python 社区的一个大牛, 当时看过一遍, 现在想的比较清楚就写出来了--


https://gist.github.com/Petelin/1835fe063c38c01cf10a141736d14a9b
3228 次点击
所在节点    Python
8 条回复
petelin
2017-10-28 22:40:18 +08:00
最后有一个 tcp server 的实现, 类似于 gevent 的并发,在 handler 里写 sleep 不会被阻塞
mdzz
2017-10-28 22:59:08 +08:00
有点意思
czheo
2017-10-28 23:07:08 +08:00
lz 应该是看了这个吧,代码思路最后一部分一样。
David Beazley - Python Concurrency From the Ground Up: LIVE! - PyCon 2015
<amp-youtube data-videoid="MCs5OvhV9S4" layout="responsive" width="480" height="270"></amp-youtube>
wcsjtu
2017-10-28 23:13:06 +08:00
核心就是用 poll 做异步定时器~ 和 yield 没多大关系吧。lz 可以看看 tornado 的 sleep 实现
czheo
2017-10-28 23:18:08 +08:00
@wcsjtu 这种写法的初衷是解决多任务(concurrency),poll/select 控制异步调度,yield 实现多任务。
petelin
2017-10-29 15:13:11 +08:00
@wcsjtu 好的,我去看看,也不是异步定时器,而是异步通知,yield 正如 czheo 说的,是多任务,没有多任务,写出来的也只是 event loop 而已。
petelin
2017-10-29 15:14:23 +08:00
@czheo 应该是有一个 PPT,从 yield 开始讲的。基本都是从他那学的。关于 sleep 部分实现是我想的。
lolizeppelin
2017-10-30 11:53:59 +08:00
粗看了下 eventlet 的做法差不多...用 yield 写起来太别扭了才有 greenlet

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/401575

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX