3

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

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(gateway)模型中有另一个任务实际发送消息并运行:

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)
4

1 回答 1

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

于 2013-06-22T19:20:00.817 回答