gpt4 book ai didi

python - 被tornado.concurrent.Future异常困惑

转载 作者:行者123 更新时间:2023-12-01 03:42:49 25 4
gpt4 key购买 nike

我正在尝试实现 this question 的变体使用 Tornado future 。队列是一个问题,因为我不想积累过去的数据。 IOW,我希望一个 http 请求处理程序阻止等待另一个 http 请求处理程序在原始请求启动后发生的结果。

但我认为我错过了一步。

我的代码如下:

Events = dict()

class EventHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self, unit):
# create future to block on
future = tornado.concurrent.Future()
# store the future at a place the produce can find it
Events[unit] = future
# block waiting for the future's response
result = yield future.result()
# deregister the future
Events.pop(unit, None)
self.write(result)

@tornado.gen.coroutine
def post(self, unit):
# fetch the corresponding future if there is one
future = Events.get(unit, None)
if future:
# found one, set the result to pass body over
future.set_result(self.request.body)
else:
print('noop')
self.write(bytes())

发生的情况是我收到如下错误:

  File "./foo.py", line 44, in get
result = yield future.result()
File "/usr/lib/python3/dist-packages/tornado/concurrent.py", line 216, in result
self._check_done()
File "/usr/lib/python3/dist-packages/tornado/concurrent.py", line 294, in _check_done
raise Exception("DummyFuture does not support blocking for results")

我没有正确使用Future吗?配置时我需要执行额外的步骤吗?我是否应该创建一个实现 _check_done 行为的子类?我关于 Tornado “ future ”与其他系统“ promise ”同义的假设是否正确?除了使用 future/promise 之外,还有其他方法可以做到这一点吗?

最佳答案

您需要使用

result = yield future

不是

result = yield future.result()

yield future.result()实际上相当于yield <whatever is returned by future.result()> 。如果结果尚未准备好,则意味着 result() API 必须阻塞(意思是阻塞 Tornado 事件循环)直到结果准备好,并且 tornado.concurrent.Future不支持这一点。只能使用非阻塞的yield future等待结果构造。

关于python - 被tornado.concurrent.Future异常困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39297897/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com