Django post est-il asynchrone?

j'ai une fonction "j'aime" qui est comme les réseaux sociaux aiment ou thumbs up fonction; l'utilisateur clique sur l'étoile / cœur / n'importe quoi pour marquer le contenu comme aimé. Il est fait avec ajax et doit être rapide. Le seul problème ici, c'est que pour certaines raisons, je dois faire certaines tâches pour chaque "j'aime" et j'ai découvert qu'ils ont été codés directement dans la vue "j'aime" et cela le rend lent. Je pense utiliser des signaux pour rendre l'exécution de ces tâches asynchrones afin que la vue puisse renvoyer le json directement au javascript sans attendre la fin des tâches. J'ai commencé par créer un signal pour les "j'aime" mais j'ai réalisé que les signaux de Django n'étaient pas asynchrones et qu'ils finiraient par être les mêmes, la vue devrait attendre que le signal se termine pour renvoyer sa réponse. Donc je pourrais essayer de rendre ce signal asynchrone comme il est expliqué ici et là mais je ferais aussi bien d'utiliser le signal post_save pour le Modèle 'like' mais maintenant je me demande si la vue peut finir avant que le signal ne soit reçu exécuté?

27
demandé sur Bastian 2012-08-10 13:43:10

4 réponses

ce que vous voulez est un fil. Elles sont très faciles à utiliser. Vous venez de la sous-classe threading.Thread et écrire un run méthode:

import threading

class LikeThread(threading.Thread):
    def __init__(self, user, liked, **kwargs):
        self.user = user
        self.liked = liked
        super(LikeThread, self).__init__(**kwargs)

    def run(self):
        # long running code here

Puis, quand vous êtes prêt à faire la tâche, vous déclencher avec:

LikeThread(request.user, something).start()

le reste de votre code de vue ou ce qui va reprendre et retourner la réponse, et le thread fera avec plaisir son travail jusqu'à ce qu'il soit fait et puis se terminera.

http://docs.python.org/library/threading.html

20
répondu Chris Pratt 2012-08-10 14:53:38

regardez aussi céleri (ou plus précisément django-céleri