众所周知,在线程中,我们有一个概念叫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/