python生成器深入理解和tornado.gen.crouti

2018-05-10  本文已影响0人  不懒狮Blaise

一边循环,一边计算的叫做生成器。
带有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()
上一篇 下一篇

猜你喜欢

热点阅读