2014年1月22日 星期三 晴

本文列举一下我用SAE(Python)Cron和Taskqueue的使用的实例,本文举例用的是Tornador。

Cron的用法:

具体可以参考SAE官方的说明和例子

http://sae.sina.com.cn/?m=devcenter&catId=195

http://sae.sina.com.cn/?m=devcenter&catId=291#anchor_1f38fc1f04ff828da2112cbe0ea45887


步骤1:修改config.yaml,如下,其中schedule是和linux cronjob一个写法。

config.yaml
cron:
  - description: cron_rate_add
url: cronjob/
schedule: every 1 mins
timezone: Beijing

步骤2:url映射
urls = [
(r"/cronjob/", Mycronjob),
]

步骤3:
下面只是示例,表达出示例的意思就行,用Django或者其他框架也差不多。

class Mycronjob(MyHandler):
#  Cron使用GET方式请求URL
def post(self):
。。。。。。
#具体可以试试,到底是走get还是post,两个部分都写,打印Log出来看看
def get(self):
。。。。。。

TaskQueue的用法:

还是要先看看官方的说明:

http://sae.sina.com.cn/?m=devcenter&catId=205

http://sae.sina.com.cn/?m=devcenter&catId=291#anchor_50e2d0bd387f00d674abd097611d2a3a

步骤1:
去SAE后台创建TaskQueue队列,珍惜资源,所有APP加起来只能使用一共10个Taskqueque。

Taskqueque分顺序队列和并发队列。我的习惯是,重要的不能出错的,就顺序队列一个个执行,队列等级为0,比如我要记录哪些用户注册了。无关紧要的用并发队列,等级为6。

创建一个队列,可以在多种场景共用的,用的时候参数不同。

步骤2:
下面是在CronJob示范Taskqueque的例子,我只喜欢用add_task这种用法。

from sae.taskqueue import Task, TaskQueue,add_task

class Mycronjob(MyHandler):
 #下面这个是cronjob到点了,添加20个taskqueue的例子
 def post(self):
 for loop in xrange(20):
 add_task('pqueue6', '/task/test',"uid=%s" % (str(uid)))

步骤3:添加taskqueue的url映射。
urls = [
(r"/cronjob/", Mycronjob),
(r"/task/test", TaskJob),
]

步骤4:taskqueue的处理,这里由于有Payload,所以只处理post提交的。
class TaskJob(TbHandler):
def post(self):
uid = self.get_argument("uid",None)

#走get还是post,如果真的吃不准的话,都写,然后打Log看就明白了。
def get(self):
uid = self.get_argument("uid",None)

一些注意事项:

  1. TaskQueue的任务的最长时间不得超过30秒(用url抓网页的注意了,别在一个url执行太多东西)

  2. 所有APP创建TaskQueue总数<=10

  3. 任务的url现在已经改为相对的url,目前兼容绝对url,但是不推荐使用。 任务默认使用GET方式请求,如果Task带有payload参数且不为None则使用POST方式请求。

  4. Cron的任务执行因为是以HTTP方式(GET),所以运行时间有上限,不得超过300秒;如果用户有超过300秒的任务需要定时触发,可以将其分解成多个cron,或者将任务放入TaskQueue或者DeferredJob来异步的执行。

  5. Cron不分App版本,只对默认版本生效,当切换代码默认版本时cron会重新配置,切换成当前默认版本下的cron配置。

其他注意事项看文档吧。