2017-07-20 4 views
0

J'ai cette tâcheExiste-t-il un moyen de gérer plusieurs travailleurs céleri avec la même tâche avec des blocs atomiques?

def some_task(self, param): 
    do_some_stuff_that_might_break_with_models() 

normalement je pouvais faire:

def some_task(self, param): 
    try: 
     with transaction.atomic(): 
      do_some_stuff_that_might_break_with_models() 
    except: 
     self.retry(....) 

Mais en le faisant, il semble que si j'ai les travailleurs couple exécuter cette tâche, il va verrouiller le db parce que du bloc atomique. Mais si je m'en débarrasse, mon essai sera mis en colère. Comment pourrais-je gérer cela? J'ai essayé de prétraiter mon entrée avec des hachages uniques, puis d'envoyer chaque morceau à son propre worker et de me débarrasser des blocs atomiques et try mais en perdant la possibilité de réessayer/suivre les tâches qui ont échoué. Je peux toujours voir ce qui a échoué à partir du panneau d'administration via djcelery, mais pas dans la tâche elle-même.

Répondre

0

Avez-vous vérifié que vous pouvez verrouiller la base de données comme ceci? Je m'attendrais à ce que le gestionnaire de contexte sorte à n'importe quelle exception, en annulant la transaction: https://docs.python.org/3/reference/datamodel.html#object.exit.

Si vous utilisez Redis et que vous voulez éviter l'accès simultané, j'ai eu du succès avec python-redis-lock comme verrou distribué. Vous pouvez l'utiliser en mode bloquant ou non.