【问题标题】:Does python tornado RequestHandler coroutine safe?python tornado RequestHandler协程安全吗?
【发布时间】:2014-11-26 15:37:27
【问题描述】:

众所周知,在线程中,我们有一个概念调用thread-safe

一个我在使用tornado协程的时候,不知道RequestHandler协程的self是否安全。

这是我的代码:

class IndexHandler(tornado.web.RequestHandler):
    @tornado.gen.coroutine
    def get(self):
        self.write("Kingsoft API.")
        self.abc = 2
        yield self.gener()
        self.write(self.k)
        print self.k
        self.write("Kingsoft API.")
        return

    @tornado.gen.coroutine
    def gener(self):
        http_client = AsyncHTTPClient()
        self.k = str(int(time.time()*100000))
        response = yield http_client.fetch('http://127.0.0.1:8000/')

另一个问题是,我的代码能正常工作吗?

第三个问题是, 我只能使用self来传参和返回值,但是太丑了。 如果我想在某个函数中使用 AsyncHTTPClient 但不是以回调方式,我还有其他一些不错的方法吗?

【问题讨论】:

    标签: python tornado coroutine


    【解决方案1】:

    您的代码位于“yield”语句之间的“关键部分”——除非您执行“yield”,否则您不能被中断。因此,您无需担心在收益率之间访问“self”或任何其他值。

    参数传递在协程中正常工作,但要返回一个值(在 Python 2 中) raise gen.Return:

    class IndexHandler(tornado.web.RequestHandler):
        @tornado.gen.coroutine
        def get(self):
            self.write("Kingsoft API.")
            k = yield self.fn(2)
            self.write(k)
    
        @tornado.gen.coroutine
        def fn(self, arg):
            k = 2 * arg
            raise tornado.gen.Return(k)
    

    在 Python 3.3+ 中,一个简单的“return k”也可以。

    【讨论】:

    • 谢谢,一个很好的例子。你能告诉我如何找到更多关于龙卷风网络的例子吗?
    • 我这里有一些示例代码:emptysqua.re/blog/refactoring-tornado-coroutines 除此之外,当然还有 tornadoweb.org。 O'Reilly 的书“Tornado 简介”令人遗憾地过时了。我一直想在我的博客上写更多的例子。我知道 Ben 最近努力改进 tornadoweb.org 上的示例代码。
    猜你喜欢
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 2017-05-03
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多