使用deferred库进行后台作业

标签:Google App Engine, Python

随着任务队列API的开放,remote_api这个隐藏的较为低效的模块逐渐可以放弃了。
然而Google实际上还隐藏了一个deferred库,可以更方便地生成后台任务,详情可看《Background work with the deferred library》

这个库用起来非常简单,共有3步要做:
  1. 修改app.yaml,增加一个handler:
    - url: /_ah/queue/deferred
        script: $PYTHON_LIB/google/appengine/ext/deferred/
        login: admin
    或者在builtins里添加一行:
    - deferred: on
  2. 定义要在后台执行的函数,例如:
    def do_something_expensive(a, b, c=None):
        logging.info("Doing something expensive!")
        # Do your work here
  3. 用deferred.defer()来调用该函数:
    from google.appengine.ext import deferred
    deferred.defer(do_something_expensive, "Hello, world!", 42, c=True)
    # 还支持超时和设置队列名等,可用参数包括_countdown、_eta、_name、_transactional、_url和_queue:
    deferred.defer(do_something_expensive, "Foobie bletch", 12, _countdown=30, _queue="myqueue")
这样do_something_expensive这个函数就会在后台通过任务队列执行了,而不会影响当前请求。对于很多无关紧要的数据库操作,将节约访问者大量时间。

其他的例子大家就去看原文吧,这里只把deferred可以调用的函数的限制列出来:
  • 所有的参数都可以被pickle(也就是序列化)。
  • 不能调用嵌套函数、嵌套类的方法。
  • 不能调用lambda函数。
  • 不能调用static函数。
  • 不能调用在request handler模块里的方法。

最后,由于task queue有大小限制,当参数大于10k时,这些参数将被保存在一个_DeferredTaskEntity实体里,这会影响调用时间。

0条评论 你不来一发么↓

    想说点什么呢?