python龙卷风RequestHandler协程安全吗?

时间:2014-11-26 15:37:28

标签: python tornado coroutine

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

当我使用龙卷风协程时,我不知道RequestHandler协程的自我是否安全。

这是我的代码:

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而不是回调方式,我还有其他一些好的方法吗?

1 个答案:

答案 0 :(得分:2)

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

参数传递通常与协程一起工作,但要返回一个值(在Python 2中),请提高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+中,一个简单的“返回k”也可以。