Documentation Frappe Framework

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.

1 min de lectureMis à jour le Source : docs.frappe.io

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 :

python
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.

python
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.