python - python Tornado RequestHandler 协程安全吗?

标签 python tornado coroutine

众所周知,在线程中,我们有一个概念叫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 但不是以回调方式,我还有其他一些不错的方法吗?

最佳答案

您的代码位于“yield”语句之间的“关键部分”——除非执行“yield”,否则您不会被中断。因此,您无需担心访问“self”或 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+ 中,简单的“return k”也可以工作。

关于python - python Tornado RequestHandler 协程安全吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27153135/

相关文章:

python - 超过一类的神经网络不起作用

python - pd dataframe 按 id 添加行

更新输出时的python子进程回调

Kotlin 协程进度计数器

c# - 在某些玩家输入后如何在协程中跳出循环?

python - 从字典中的自定义函数访问值

python - 如何检测 Tornado 环境变量

python - Tornado -redis : RPOP works but BRPOP doesn't?

python - 生成器函数和异步生成器函数的用途有什么区别

Python 统一差异,行号来自 "files"