我的GAE应用程序应该将多个文件上传到另一台服务器(使用urlfetch)。 如何使用tasks实现这一点,并假设在上一个任务完成时我应该再执行一次操作?
我如何知道上一个任务何时完成?
UPD 即可。以下方法与任务是否正确?
class Accumulator(db.Model):
counter = db.IntegerProperty()
def increase_counter(key):
obj = db.get(key)
obj.counter += 1
obj.put()
def zero_counter(key):
obj = db.get(key)
obj.counter = 0
obj.put()
def decrease_counter(key):
obj = db.get(key)
obj.counter -= 1
obj.put()
def get_counter(key):
obj = db.get(key)
return obj.counter
class PublishPhotosHandler(webapp.RequestHandler):
# where this tasks_counter should be defined? seems not here
db.run_in_transaction(zero_counter, some_unique_key)
for argument in files_arguments:
taskqueue.add(url='/upload', params={'key': key})
db.run_in_transaction(increase_counter, some_unique_key)
# here we redirect user to another page '/checkstatus'
...
# nothing is shown to the user here
class UploadWorker(webapp.RequestHandler):
def post(self):
key = self.request.get('key')
result = urlfetch.fetch(...)
db.run_in_transaction(decrease_counter, some_unique_key)
# how to return there error, so the task will be retried?
# nothing is shown to the user here
# this is our '/checkstatus' page
class CheckStatus(webapp.RequestHandler):
def get(self, key):
if get_counter(some_unique_key) == 0:
# all tasks finished
# show the content
答案 0 :(得分:1)
您可以创建一个计数器实体,该实体存储要执行的当前任务数。而且每项任务。完成后,必须减少此计数器的值,在交易中。如果它变为0,那么它就是最后一个动作,刚刚完成。
答案 1 :(得分:1)
您显示的代码无效 - 您启动的任务与计数器的本地范围不同,甚至可能不在同一台计算机上。您可以使用基于数据存储区的计数器,如@splix建议的那样,但这看起来像Pipeline library非常适合的情况。