【问题标题】:Task fanout - how to bulk add Tasks to the Queue - more than 5任务扇出 - 如何批量添加任务到队列 - 超过 5
【发布时间】:2010-09-30 13:53:29
【问题描述】:

我正在使用一个任务(排队任务)来排队多个其他任务——扇出。当我尝试使用 Queue.add 和任务参数是具有超过 5 个元素的 Task 实例列表并且在事务中...我收到此错误。

JointException: taskqueue.DatastoreError caused by: 
    <class 'google.appengine.api.datastore_errors.BadRequestError'> 
    Too many messages, maximum allowed 5

还有其他方法可以在一个事务中对超过 5 个任务进行排队吗?

或者……

也许我不需要交易,原因:

  1. 我不在乎这些任务中的任何一个是否会排队两次,并且
  2. 如果其中任何一个队列失败,则整个队列任务将重新运行。

所以告诉我如何在一个事务中排队超过 5 个任务,或者告诉我不要使用事务,因为我真的不需要一个。

【问题讨论】:

    标签: python google-app-engine task-queue


    【解决方案1】:

    一个接近解决您的问题的解决方案是添加一个事务性任务,以扇出剩余的任务。只需在现有事务中添加一个扇出任务即可。

    除非有业务逻辑原因,否则不要重新运行已经运行的任务。防止任务被重新插入(即重复)很简单并且可以节省资源。您的扇出任务基本上如下所示:

    class FanOutTask(webapp.RequestHandler):
      def get(self):
        name = self.request.get('name')
        params = deserialize(self.request.get('params'))
    
        try:
          task_params = params.get('stuff')
          taskqueue.add(url='/worker/1', name=name + '-1', params=task_params)
        except TaskAlreadyExistsError:
          pass
    
        try:
          task_params = params.get('more')
          taskqueue.add(url='/worker/2', name=name + '-2', params=task_params)
        except TaskAlreadyExistsError:
          pass
    

    以事务方式添加扇出任务可确保将其排入队列。已经运行的任务导致的错误会被捕获并忽略,其他错误会导致扇出任务重新运行。使用这种模式,您可以非常轻松地插入许多子任务。

    【讨论】:

      猜你喜欢
      • 2017-04-02
      • 1970-01-01
      • 1970-01-01
      • 2011-01-08
      • 2019-02-24
      • 1970-01-01
      • 2019-09-13
      • 2017-01-30
      • 2016-07-06
      相关资源
      最近更新 更多