在google-app-engine上同时推迟许多任务

时间:2015-11-05 18:33:42

标签: python google-app-engine queue deferred

我正在谷歌应用引擎上开发一个python应用程序。我有一个CRON工作,它每天导入一个从S3存储桶到GS存储桶的20个新文件列表。

这是我的代码:

import webapp2
import yaml
from google.appengine.ext import deferred

class CronTask(webapp2.RequestHandler):

    def get(self):
        with open('/my/config/file') as file:
            config_dict = yaml.load(file_config_file)
        for file_to_load in config_dict:
            deferred.defer(my_import_function, file_to_load)


app = webapp2.WSGIApplication([
    ('/', CronTask)
], debug=True)

请注意my_import_function是另一个包的一部分,需要一些时间才能完成。

我的问题:为此任务使用函数deferred.defer是一个好主意,还是应该不同地为我的所有参数启动my_import_function

1 个答案:

答案 0 :(得分:1)

您应该使用任务队列,但根据您拥有的任务数量,您可能不想使用deferred.defer()

使用deferred.defer(),您每次通话只能排队一项任务。如果你列入了很多任务,那就非常低效了。这真的很慢:

for x in some_list:
    deferred.defer(my_task, x)

有很多任务,做这样的事情要高效得多:

task_list = []
for x in some_list:
    task_list.append(taskqueue.Task(url="/task-url",params=dict(x=x)))
taskqueue.Queue().add(task_list)

大约一年前,我进行了时间比较,后者至少比前者快了一个数量级。