我正在谷歌应用引擎上开发一个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
?
答案 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)
大约一年前,我进行了时间比较,后者至少比前者快了一个数量级。