Frappe Framework
Lancer des tâches de fond
Une requête trop longue se met en file pour un worker. Frappe utilise Python RQ, avec les files default, long et short.
Pourquoi une file
Parfois la requête de l’utilisateur ne doit pas s’exécuter tout de suite. Elle rejoint une file traitée par un worker de fond. Les workers web restent libres, et les longs travaux ne prennent pas toutes les ressources.
Frappe utilise Python RQ. L’exemple publie un message temps réel au début et à la fin, puis enqueue le travail :
import frappe
def long_job(arg1, arg2):
frappe.publish_realtime("msgprint", "Starting long job...")
frappe.publish_realtime("msgprint", "Ending long job...")
def enqueue_long_job(arg1, arg2):
frappe.enqueue("myapp.mymodule.long_job", arg1=arg1, arg2=arg2)Le travail part dans la file default. Les autres files sont long et short. Choisissez selon la durée estimée. Depuis la version 14, at_front=True place le travail en tête de file.
Action différée sur un document
On peut différer une action du document. L’exemple cité est un rapprochement de stock de plus de 100 articles, exécuté en tâche de fond. L’appel est doc.queue_action("submit"). Cela ne fonctionne que pour save, submit et cancel.
def submit(self):
if len(self.items) > 100:
self.queue_action("submit")
else:
self._submit()Débogage
Sous bench start, les journaux apparaissent dans le terminal. Le worker default ne redémarre pas tout seul : après une modification, il faut arrêter bench et le relancer.
Point d’attention
Le chemin passé à frappe.enqueue est une chaîne, pas la fonction elle-même. queue_action ne couvre pas d’autres méthodes que save, submit et cancel. Sans redémarrage, le worker default garde l’ancien code.
