【发布时间】:2016-03-29 14:16:33
【问题描述】:
我有一些 Tornado 的协程相关问题。
有一些python-model A,有能力执行一些功能。该功能可以从模型外部设置。我不能改变模型本身,但我可以传递任何我想要的函数。我正在尝试通过我的函数教它与 Tornado 的 ioloop 一起工作,但我做不到。
这里是sn-p:
import functools
import pprint
from tornado import gen
from tornado import ioloop
class A:
f = None
def execute(self):
return self.f()
pass
@gen.coroutine
def genlist():
raise gen.Return(range(1, 10))
@gen.coroutine
def some_work():
a = A()
a.f = functools.partial(
ioloop.IOLoop.instance().run_sync,
lambda: genlist())
print "a.f set"
raise gen.Return(a)
@gen.coroutine
def main():
a = yield some_work()
retval = a.execute()
raise gen.Return(retval)
if __name__ == "__main__":
pprint.pprint(ioloop.IOLoop.current().run_sync(main))
所以问题是我在一部分代码中设置了函数,但在另一部分用模型的方法执行。
现在,Tornado 4.2.1 给了我“IOLoop 已经在运行”,但在 Tornado 3.1.1 中它可以工作(但我不知道具体如何)。
我知道接下来的事情:
- 我可以创建新的 ioloop,但我想使用现有的 ioloop。
- 我可以用一些知道 genlist 的结果是 Future 的函数来包装 genlist,但我不知道如何阻止执行,直到将 future 的结果设置在同步函数中。
另外,我不能使用 a.execute() 的结果作为未来对象,因为 a.execute() 可以从代码的其他部分调用,即它应该返回列表实例.
所以,我的问题是:是否有机会使用当前 IOLoop 从同步模型的方法执行异步 genlist?
【问题讨论】:
标签: python asynchronous tornado future coroutine