Django是这个链接任务吗?

时间:2013-06-20 16:57:32

标签: django celery

我有一个芹菜任务,它将消息添加到数据库,如下所示:

class ProcessRequests(Task):

    def run(self, batch):

        for e in q:
            msg = Message.objects.create(
                recipient_number=e.mobile,
                content=batch.content,
                sender=e.contact_owner,
                billee=batch.user,
                sender_name=batch.sender_name
            )
            gateway = Gateway.objects.get(pk=2)
            msg.send(gateway)

然后在 msg.send(网关)模型中,还有另一个任务实际发送消息并运行它:

class SendMessage(Task):
    name = "Sending SMS"
    max_retries = 10
    default_retry_delay = 3

    def run(self, message_id, gateway_id=None, **kwargs):
        logging.debug("About to send a message.")


        so some stuff here

        logging.debug("Done sending message.")

这一切都运行正常(测试了超过1000条消息),但我在某处读到你不应该将任务链接在一起,但这不是链接,对吧?我不等待一个人完成另一个人才能跑完。

此示例在性能等方面是否正常?

发送是这样的:

def send(self, message):
    """
    Use this gateway to send a message.

    If ``djcelery`` is installed, then we assume they have set up the
    ``celeryd`` server, and we queue for delivery. Otherwise, we will
    send in-process.

    .. note::
        It is strongly recommended to run this out of process,
        especially if you are sending as part of an HttpRequest, as this
        could take ~5 seconds per message that is to be sent.
    """
    if 'djcelery' in settings.INSTALLED_APPS:
        import sms.tasks
        sms.tasks.SendMessage.delay(message.pk, self.pk)
    else:
        self._send(message)

1 个答案:

答案 0 :(得分:5)

简短的版本,是的,你在这里做的正确。

长版:

问题是你不想要这样的东西:

@task
def something(**kwargs):
    # do something here
    something_else.delay().get()

@task
def something_else(**kwargs):
    # do something else here
    pass

这将使something等待something_else的结果。

您甚至可以考虑将消息的创建移动到任务(因此您的循环只会产生任务并且不会立即连接到数据库)。

PS:如果您想跟踪ProcessRequests任务结果中的所有结果,您可以将其作为子结果执行:http://docs.celeryproject.org/en/latest/userguide/canvas.html?highlight=asyncresult#subtasks

它可以帮助您对结果进行分组:http://docs.celeryproject.org/en/latest/userguide/canvas.html?highlight=asyncresult#group-results