【问题标题】:Tornado AsyncHTTPClient fetch callback: Extra parameters?Tornado AsyncHTTPClient 获取回调:额外参数?
【发布时间】:2011-05-24 23:09:31
【问题描述】:

我对整个异步游戏有点陌生(主要是 Django 人),但我想知道:如何将额外的参数传递给 Tornado 的 AsyncHTTPClient.fetch 回调?例如,我正在跟踪回调被调用的次数(为了等到执行了一定数量之后再处理数据),我想做类似的事情:

def getPage(self, items,iteration):
    http = AsyncHTTPClient()    
    http.fetch(feed, callback=self.resp(items,iteration))
def resp(self, response, items, iteration):
    #do stuff
    self.finish()

【问题讨论】:

  • 为什么需要跟踪回调被调用的次数?

标签: python asynchronous tornado


【解决方案1】:

您需要“绑定”您的附加参数。 使用 functools.partial,像这样:

items = ..
iteration = ..
cb = functools.partial(self.resp, items, iteration)

或者你可以使用 lambda,像这样:

cb = lambda : self.resp(items, iteration)

(您可能需要将签名添加到 def resp(self, items, iteration, response):)

【讨论】:

  • 谢谢!这太棒了,正是我想要的,但我重写了没有异步的程序,因为我有点意识到我正在做的事情没有必要(聚合 RSS 提要上的数据)。不过,我相信我会再次使用它!
  • 我正在考虑关闭,但这似乎是更清洁的方式。
  • 请注意:我发现functools.partial(self.resp, items, iteration) 方法需要response 作为回调签名中的最后一个参数。例如def resp(self, items, iteration, response):
  • @MechEthan 你可以随时通过def resp(*args): print args检查参数的位置
【解决方案2】:

如果您从 RequestHandler 内部调用 fetch,您也可以考虑使用 gen.coroutine 装饰器。在这种情况下,您无需向回调添加额外的参数,因为您可以在与 fetch 调用相同的范围内看到结果。

【讨论】:

  • “虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接的答案可能会失效。”
猜你喜欢
  • 2017-09-20
  • 1970-01-01
  • 2012-10-25
  • 2016-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-26
  • 1970-01-01
相关资源
最近更新 更多