我有一个芹菜任务,它将消息添加到数据库,如下所示:
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)
答案 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