例子來自https://blog.tonyseek.com/post/event-manage-with-greenlet/python
加了一些註釋看懂了:函數
註釋中的數字表示執行的順序,這個簡單的例子用到了python自帶的生成器,關鍵的地方是:調用生成器的模塊使用next()時就開始執行生成器中的語句,生成器執行到yield 的地方會掛起,同時返回yield的值給調用模塊。當執行fire_event('click')時,會實現另一個next(),這時生成器獲得信號,從掛起的地方開始執行,直到結束。而在響應函數resume()中next()沒有收到yield返回的值,因此會發生StopIteration異常.從而結束整個程序post
#!/usr/bin/env python #coding=utf-8 from time import sleep event_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_event def 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()