首页 > 代码库 > 关于python协程的一个例子的学习
关于python协程的一个例子的学习
例子来自https://blog.tonyseek.com/post/event-manage-with-greenlet/
加了一些注释看懂了:
注释中的数字表示执行的顺序,这个简单的例子用到了python自带的生成器,关键的地方是:调用生成器的模块使用next()时就开始执行生成器中的语句,生成器执行到yield 的地方会挂起,同时返回yield的值给调用模块。当执行fire_event(‘click‘)时,会实现另外一个next(),这时生成器得到信号,从挂起的地方开始执行,直到结束。而在响应函数resume()中next()没有收到yield返回的值,所以会发生StopIteration异常.从而结束整个程序
#!/usr/bin/env python#coding=utf-8from time import sleepevent_listeners = {}def fire_event(name): event_listeners[name]()def use_event(func): def call(*args, **kwargs): print ‘use_event‘ ## 1 generator = func(*args, **kwargs) ## 2 print ‘come here‘ ## 3 event_name = generator.next() ## 4 开启generator,期待其返回一个yield()的值 print ‘no wait here‘ ## 7 def resume(): try: print ‘second time‘ ## 10 next(generator) ##唤醒了test_work(),期待返回一个yield(),但是test_work只有一个yield(),所以这里会出现异常 except StopIteration: print "test_work() doesn‘t have another yield()" ## 11 pass event_listeners[event_name] = resume print ‘register !!‘ ## 8 return call@use_eventdef test_work(): print ‘wait‘ ## 5 sleep(2) yield ‘click‘# 6 执行至此,返回‘click‘给use_event中的next();test_work()挂起,等待另一个next()唤醒 print ‘click.‘ if __name__ == ‘__main__‘: test_work() sleep(3) fire_event(‘click‘)#9 唤醒test_work()
关于python协程的一个例子的学习
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。