任务扇出 - 如何批量添加任务到队列 - 超过5

问题描述:

我正在使用任务(排队任务)排队多个其他任务 - 扇出。当我尝试使用Queue.add,并且任务参数是具有多于5个元素的Task实例列表并且在事务中时...我得到此错误。任务扇出 - 如何批量添加任务到队列 - 超过5

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

是否有另一种方法来排队超过5个任务的交易?

或者......

也许我并不需要一个事务,原因:如果排队

  1. 如果任何这些任务被排队两次,反正我不在乎,和
  2. 将失败,然后整个排队任务将重新运行。

因此,告诉我如何排队超过5个任务的交易或告诉我不使用交易的原因,我真的不需要一个。

一个解决方案关闭来解决你的问题是添加一个事务性任务,扇出剩下的任务。只需在现有交易中添加一个扇出任务即可。

除非有商业逻辑理由这样做,否则不要重新运行已经运行的任务。防止任务重新插入(即重复)很简单,节省资源。你扇出任务基本上是这样的:

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 

添加扇出任务的事务,确保其入队。已经运行的任务导致的错误被捕获并被忽略,其他错误会导致扇出任务重新运行。有了这个模式,你可以很容易地插入许多子任务。