RQ 小提示

给那些准备在 Django 中使用 RQ 的人一些提示。

译者: Zeray Rice

我最近在我的项目中把 RQ 作为异步任务管理器添加了进来,如果你还没有听说过 RQ ,它是一个简单的 Celery 的替代品,用于处理异步任务。

热情模式 [1]

如果你很了解 Celery 的话,你可能知道他有一个热情模式,能够让任务变成同步式的,这样会使测试与本地开发的过程变的更方便一些, RQ 并不支持这个特性,但是他能够很轻松的实现这样的功能。

import redis
import rq

from django.conf import settings


def enqueue(function, *args, **kwargs):
    opts = getattr(settings, 'RQ', {})
    eager = opts.get('eager', False)
        if eager:
        return function(*args, **kwargs)

    else:
        conn = redis.Redis(**opts)
        queue = rq.Queue('default', connection=conn)
        return queue.enqueue(function, *args, **kwargs)

在这段代码中,我们使用 Django 设置来选择是否启用“热情模式”,同时在这个设置中也包含了对 Redis 服务器的设置(域名,端口,数据库名等等),最简单的运行“热情模式”的 settings.py 是:

RQ = {'eager': True}

现在当你需要使用 RQ 的 Queue.enqueue 方法时,请改用上面我们实现的 enqueue 函数,这个例子只是简单的使用了默认队列,你可以根据你的需要去改动他。

集成 Sentry

当 RQ 任务失败的时候,回溯栈将被记录,使用 rq-dashboard 等工具我们可以方便的找到哪里出了问题,但是如果你使用 Sentry ,你就无法看到正确的错误信息。

通过一个简单的修饰器,你可以让 RQ 把错误报告提交给 Sentry:

from functools import wraps

from django.conf import settings
from raven import Client


def raven(function):
    @wraps(function)
    def ravenify(*args, **kwargs):
        try:
            function(*args, **kwargs)
        except Exception:
            if not settings.DEBUG:
                client = Client(dsn=settings.SENTRY_DSN)
                client.captureException()
            raise
    return ravenify

嗯,现在只要保证你的设置中有 SENTRY_DSN 字段,用 @raven 修饰你的任务,就能够使 Sentry 正常工作了。

[1]译注:即惰性求值的反义词,详见维基百科 及早求值 词条

Table Of Contents

This Page