我正在使用一个任务(排队任务)来排队多个其他任务 - 扇出。当我尝试使用Queue.add,任务参数是一个包含超过5个元素的Task个实例的列表并且在事务中...我得到了这个错误。
JointException: taskqueue.DatastoreError caused by:
<class 'google.appengine.api.datastore_errors.BadRequestError'>
Too many messages, maximum allowed 5
是否有其他方法可以在事务中排队5个以上的任务?
或......
也许我不需要交易,原因是:
那么告诉我如何在一个事务中排队超过5个任务或告诉我不要使用事务因为我真的不需要一个。
答案 0 :(得分:2)
解决问题的一个解决方案关闭是添加一个事务性任务,将剩余的任务分散出去。只需在现有交易中添加一个扇出任务即可。
除非出于业务逻辑原因,否则请勿重新运行已运行的任务。防止重新插入(即复制)任务非常简单并节省资源。您的扇出任务基本上如下:
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
以事务方式添加扇出任务可确保将其排入队列。由于已经运行的任务导致的错误被捕获并被忽略,其他错误导致扇出任务重新运行。使用此模式,您可以非常轻松地插入许多子任务。