美文网首页
python生成器深入理解和tornado.gen.crouti

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

作者: 不懒狮Blaise | 来源:发表于2018-05-10 15:43 被阅读0次

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

    相关文章

      网友评论

          本文标题:python生成器深入理解和tornado.gen.crouti

          本文链接:https://www.haomeiwen.com/subject/qvbzrftx.html