python–tornado.gen.engine vs tornado.gen.coroutine的区别

python–tornado.gen.engine vs tornado.gen.coroutine的区别,第1张

概述来自tornado.gen documentation可以有人帮我理解tornado.gen.coroutine和tornado.gen.engine之间的确切区别最佳答案正如gen.engine的龙卷风文档所说: This decorator is similar to coroutine, except it does not return a

来自tornado.gen documentation可以有人帮我理解tornado.gen.coroutine和tornado.gen.engine之间的确切区别最佳答案正如gen.engine的龙卷风文档所说:

This decorator is similar to coroutine,except it does not return a
Future and the callback argument is not treated specially.

正如gen.coroutine文档所说

From the caller’s perspective,@gen.coroutine is similar to the
combination of @return_future and @gen.engine.

gen.engine基本上是一个比coroutine更老的,更简化的版本.如果您正在编写新代码,则应遵循文档的建议并始终使用tornado.gen.coroutine.

如果你查看两个函数的代码(删除了文档),这是非常明显的.

发动机:

def engine(func):    @functools.wraps(func)    def wrapper(*args,**kwargs):        runner = None        def handle_exception(typ,value,tb):            if runner is not None:                return runner.handle_exception(typ,tb)            return False        with ExceptionStackContext(handle_exception) as deactivate:            try:                result = func(*args,**kwargs)            except (Return,stopiteration) as e:                result = getattr(e,'value',None)            else:                if isinstance(result,types.GeneratorType):                    def final_callback(value):                        if value is not None:                            raise ReturnValueIgnoredError(                                "@gen.engine functions cannot return values: "                                "%r" % (value,))                        assert value is None                        deactivate()                    runner = Runner(result,final_callback)                    runner.run()                    return            if result is not None:                raise ReturnValueIgnoredError(                    "@gen.engine functions cannot return values: %r" %                    (result,))            deactivate()            # no yIEld,so we're done    return wrapper

协程:

def coroutine(func):    @functools.wraps(func)    def wrapper(*args,**kwargs):        runner = None        future = TracebackFuture()        if 'callback' in kwargs:            callback = kwargs.pop('callback')            Ioloop.current().add_future(                future,lambda future: callback(future.result()))        def handle_exception(typ,tb):            try:                if runner is not None and runner.handle_exception(typ,tb):                    return True            except Exception:                typ,tb = sys.exc_info()            future.set_exc_info((typ,tb))            return True        with ExceptionStackContext(handle_exception) as deactivate:            try:                result = func(*args,None)            except Exception:                deactivate()                future.set_exc_info(sys.exc_info())                return future            else:                if isinstance(result,types.GeneratorType):                    def final_callback(value):                        deactivate()                        future.set_result(value)                    runner = Runner(result,final_callback)                    runner.run()                    return future            deactivate()            future.set_result(result)        return future    return wrapper

乍一看,这些都可能很难理解.但是,显然代码非常相似,除了@ gen.coroutine对回调kwarg有一些特殊的处理,它构建/返回一个Future. @ gen.engine有一些代码,如果你试图从它返回一些东西,而不是把它放在Future中,它会特意抛出一个错误. 总结

以上是内存溢出为你收集整理的python – tornado.gen.engine v / s tornado.gen.coroutine的区别全部内容,希望文章能够帮你解决python – tornado.gen.engine v / s tornado.gen.coroutine的区别所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1207895.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-04
下一篇2022-06-04

发表评论

登录后才能评论

评论列表(0条)

    保存