关于python协程的一个例子的学习

  • 格式:doc
  • 大小:83.50 KB
  • 文档页数:2

关于python协程的一个例子的学习

注释中的数字表示执行的顺序,这个简单的例子用到了python自带的生成器,关键的地方是:调用生成器的模块使用next()时就开始执行生成器中的语句,生成器执行到yield 的地方会挂起,同时返回yield的值给调用模块。当执行fire_event('click')时,会实现另外一个next(),这时生成器得到信号,从挂起的地方开始执行,直到结束。而在响应函数resume()中next()没有收到yield返回的值,所以会发生StopIteration异常.从而结束整个程序

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35 #!/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()挂起,等待另一个36

37

38

39

40 next()唤醒

print 'click.'

if __name__ == '__main__':

test_work()

sleep(3)

fire_event('click')#9 唤醒test_work()