【问题标题】:Can google.appengine.api.taskqueue payload argument be query result?google.appengine.api.taskqueue 有效载荷参数可以是查询结果吗?
【发布时间】:2011-02-06 15:32:50
【问题描述】:

我正在尝试将查询结果传递给任务队列:

q = models.Spam.all()
results = q.fetch(10)
taskqueue.add(url='/_ah/queue/do-spams', payload=results)

这行不通。我要么参数结构错误,要么负载不能是结果集。

【问题讨论】:

  • 附带说明,这可能是个坏主意:实体可能很庞大,并且任务队列有效负载有 10k 的限制。 Deferred 将在数据存储中存储任何更大的内容,因此您不会比仅获取任务队列处理程序中的记录获得任何好处。此外,在您的任务执行时,这些记录可能已经过时了。
  • @NickJohnson:当我们有这么有用的延迟库时,为什么我们需要或者为什么其他人使用 taskqueue.add() 方法?

标签: python google-app-engine task datastore


【解决方案1】:

我不会直接添加到任务队列,而是使用延迟的queue。延迟队列具有与任务队列类似的功能。延迟队列的关键特性之一是您可以将任何类型的数据传递给您的内部方法之一。

您指定要延迟的方法、参数值和延迟队列,appengine 负责正确传递数据。

【讨论】:

  • 有趣 - 完全错过了。 “deferred 库允许您通过公开一个简单的函数 deferred.defer() 来绕过设置专用任务处理程序以及序列化和反序列化参数的所有工作。”
  • Deferred 使用标准任务队列,Nick 只是提供了一个很好的通用包装器来简化这种类型的应用程序。您可以通过例如腌制结果并通过有效负载将它们传递给您的任务来实现相同的目的。
【解决方案2】:

通过阅读有关任务队列的文档,我怀疑您需要传递一个字符串,或者至少是一个具有字符串表示形式的对象。

此任务的有效负载数据将作为 HTTP 请求正文传送到 webhook。可能是一个包含二进制数据的字符串。

http://code.google.com/appengine/docs/python/taskqueue/tasks.html#Task

为什么它不起作用?你有错误吗?要进行快速测试,您可以尝试通过str(results)。如果它确实需要一个字符串,您可以尝试序列化您的结果,例如JSON。

【讨论】:

    猜你喜欢
    • 2021-11-20
    • 2018-07-12
    • 1970-01-01
    • 1970-01-01
    • 2019-07-30
    • 2011-02-17
    • 1970-01-01
    • 2020-12-08
    • 1970-01-01
    相关资源
    最近更新 更多