众所周知,在线程中,我们有一个概念调用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而不是回调方式,我还有其他一些好的方法吗?
答案 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”也可以。