一边循环,一边计算的叫做生成器。
带有yield关键字的函数为生成器。
下面说一个带yield函数的生成器
def fib(max):
"""1,1,2,3,5,8最后一个值为前两个值之和"""
a, b = 0, 1
while(b < max):
yield b
n = a + b
a= b
b = n
f = fib(100)
print(list(f))
下面是模仿tornado.gen.croutine的方法
import tornado.ioloop
from tornado.httpclient import AsyncHTTPClient
import functools
def task(fun, url):
return functools.partial(fun, url)
def callback(gen, response):
try:
print('callback:', response)
gen.send(response) # 把结果send到yield后的response
except StopIteration:
pass
def sync(func):
def wrapper():
gen = func()
f = gen.__next__() # 取生成器yield的函数
print('inner sync', f, gen)
f(functools.partial(callback, gen)) # 代入回调函数functools.partial(callback, gen), 回调函数的参数值为gen(就是fetch函数)
return wrapper
@sync
def fetch():
response = yield task(AsyncHTTPClient().fetch, 'http://www.bing.com')
print(response)
fetch() # 等于sync(fetch)()
tornado.ioloop.IOLoop.instance().start()