J'ai une tâche de céleri qui ajoute des messages à une base de données comme ceci:Django est ce chaînage des tâches?
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)
Puis, dans la msg.send (passerelle) modèle il y a une autre tâche qui envoie en fait le message et exécute ceci:
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.")
tout cela fonctionne très bien (avec plus de 1000 messages testés), mais je l'ai lu quelque part que ensemble, mais vous ne devriez pas les tâches de la chaîne ce n'est pas enchaînez, droit? Je n'attends pas que l'un finisse avant que l'autre puisse courir.
Cet exemple est-il correct en termes de performances, etc.?
envoyer quelque chose comme ceci:
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)
Pourriez-vous poster le code pour 'msg.send (passerelle)'? –
@NicolasCortot mis à jour avec l'exemple. merci :) – Prometheus
Pourquoi utilisez-vous django + db + céleri pour créer votre propre file d'attente de messages? Je vous suggère d'utiliser directement une file d'attente de messages, ou d'utiliser les fonctionnalités de mise en file d'attente de céleri. – Marcin