我们说我有一个运行一个小时的脚本。它只是睡了一个小时,并在一小时结束时更改了数据存储区中的内容。
def task(keyname):
time.sleep(3600)
q = Item.all()
item = q.filter("keyname = ", "%s" % keyname).get()
item.value += 1
item.put()
实现这一目标的最佳方式是什么?
cron文档说" cron调用的HTTP请求可以运行长达10分钟,但受到与其他HTTP请求相同的限制。"我假设这意味着超过十分钟的cron任务将会中断。
我查看了Task Queue文档,但我不想一个接一个地排队这些任务。我希望他们同时发生。
我正在考虑添加一个计数器属性并每分钟运行一次任务而不是睡觉:
def task(keyname):
q = Item.all()
item = q.filter("keyname = ", "%s" % keyname).get()
if item.counter == 60:
item.value += 1
item.put()
else:
item.counter += 1
item.put()
但是访问数据库的次数太多了。
那么,有没有人有更聪明的解决方法?
答案 0 :(得分:0)
当你说你希望“这些任务”同时发生时,我不明白你的意思;你只提到了一项任务。
无论如何,任务队列是执行此操作的方法。您可以使用Task构造函数的countdown
参数告诉它在3600秒内执行。
我通常更喜欢使用deferred
library,它可以动态创建任务,而无需设置特定的处理程序:
from google.appengine.ext import deferred
...
deferred.defer(my_task, _countdown=3600)
答案 1 :(得分:0)
cron作业命中一个处理程序,这个处理程序启动一个任务。这个过程通常不到一秒钟。之后,只要您需要,任务就可以运行 - 如有必要,永远可以运行。这一切都取决于on the target of a task。 10分钟限制仅适用于前端(F类型)实例。
如果需要,您可以同时执行许多任务。
答案 2 :(得分:0)
@Soricidae,你正在建立一个cron任务。
*。另外,我强烈建议使用任务队列来让appengine在cron任务期间解决你的加载时间问题。
例如,在我的情况下,我有一个欢迎处理程序,通过电子邮件发送给用户,每24小时检查一次超过1天的新用户是否尚未受到欢迎......
所以,我已经定义了以下路由(1表示cronjob,1表示taskqueue):
RedirectRoute('/cronjob-welcome/', handlers.WelcomeCronjobHandler, name='cronjob-welcome', strict_slash=True),
RedirectRoute('/taskqueue-welcome/', handlers.WelcomeHandler, name='taskqueue-welcome', strict_slash=True),
然后,我已经定义了一个cronjob处理程序,一旦调用它作为任务队列的真实操作处理程序,请参阅:
class WelcomeCronjobHandler(BaseHandler):
def get(self):
welcome_url = self.uri_for('taskqueue-welcome')
taskqueue.add(url=welcome_url, params={
'offset': 0
})
你可以看到这个处理程序要求welcome_url,它在路由中调用定义的处理程序 taskqueue-welcome 并执行以下操作:
class WelcomeHandler(BaseHandler):
"""
Core Handler for sending users welcome message
Use with TaskQueue
"""
@taskqueue_method
def post(self):
# ... MY CODE FOR EMAILING USERS ....
# ... YOUR CODE SHOULD GO IN HERE ...
最后,为了每24小时调用一次cronjob处理程序,在我的cron.yaml文件中我添加了以下内容,请注意 cronjob-welcome 的路由:
- description: welcome messaging
url: /cronjob-welcome/
schedule: every day 13:00
总结一下,我的 cron.yaml 每天13:00致电 cronjob处理程序,同时触发任务队列处理程序,调度google appengine taskqueue解决我的预定任务。
希望这有帮助。