8
votes

Django: Quels sont exactement les signaux?

J'ai du mal à comprendre comment les signaux travaillent dans ma demande (et comment ils fonctionnent la période). Ce sont trois domaines où je suppose qu'ils s'appliqueraient (avec mes connaissances actuelles):

  1. Envoyez XML sur un serveur distant pour signaler (après la fin d'une transaction).
  2. reformez une image et téléchargez la vignette sur S3 après que un utilisateur vous télécharge.
  3. Supprimer les anciennes images de S3 après qu'un utilisateur supprime un objet d'image de son compte.

    Suis-je totalement hors base (je sens que je pourrais être). Suis je reçois des signaux et de multi-filets mélangés ? Si oui, comparez-vous dans la demande de là? Sont-ils seulement pour découplage? En outre, quelle est la transaction avec laquelle vous en assurez-vous que vous les instanciez tôt et n'utilisez pas une fonction locale (car ils obtiendront des ordures collectées)? Quelqu'un peut-il élaborer à ce sujet? Devrais-je les mettre tous dans le middleware de la demande afin que je n'ai pas à vous inquiéter?


2 commentaires

Je ne comprends pas votre référence à Multi Filetage. À quoi ça sert?


@Andrea Zilio Voir les commentaires sur la réponse 1


4 Réponses :


16
votes

Les signaux Django sont un moyen d'effectuer une action A en réponse à un événement E .

Dans un monde irréel, vous pouvez éviter d'utiliser des signaux en modifiant le code lorsque l'événement E se produit et en ajoutant le code pour effectuer l'action a . .

Le problème est que cela fait de la maintenabilité, de la lisibilité et de nombreux autres adjectifs d'ingénierie logicielle :)

Les signaux vous permettent de faire la même chose indpostence à partir de l'endroit ou de la façon dont l'événement E se produit et ce fais ainsi de manière intelligente qui permet de maintenir la maintenabilité, la lisibilité, etc.

Oui, je pense que dire que dire que des signaux sont utiles pour permettre découplage est vraiment vrai.

(Vous avez également mentionné Multi threading. Si vous l'avez fait, parce que vous pensez que les signaux sont bons parce qu'ils sont exécutés simultanément et si vite ... bien ... je ne sais pas si elles sont exécutées simultanément mais de toute façon je n'ai vraiment pas Il faut que ce soit le point pour quels signaux Django sont utiles pour)

Un exemple de bon moyen de tirer parti des signaux concerne le fait que lorsque vous souhaitez stocker d'autres informations à un utilisateur de Django, vous devez utiliser UserProfiles. Dans ce cas, le Documentation elle-même , vous dire qu'il peut être pratique d'enregistrer un signal en réponse à toute création de nouveaux utilisateurs simplement pour ajouter aux nouveaux utilisateurs créés un profil d'utilisateur vide.


7 commentaires

Les signaux Django sont définitivement expédiés de manière synchrone.


@Ignacio Mon intention N'était de ne pas dire que les signaux sont exécutés simultanément, mais juste pour essayer d'imaginer pourquoi la multi-threading a été mentionnée dans la question ... Je ne savais pas comment ils ont été manipulés. Maintenant oui. Merci Ignacio;)


Considéreriez-vous les 3 tâches de ma liste en tant que bons candidats à effectuer via des signaux?


La raison pour laquelle j'ai mentionné Multi threading n'est pas pour la prestation de concurrence, mais plutôt pour le cas où l'utilisateur voit la page "Merci" et c'est fait le chargement, mais les choses se passent toujours sur le serveur. Est-ce possible?


Tâche 1, pas vraiment. Il suffit de mettre le code pour le télécharger après le code de la transaction. Tâche 2, bien sûr. Mais vous serez peut-être mieux à l'excès d'agriculture à un processus séparé. Tâche 3, éventuellement, bien que l'utilisation du mot "Supprimer" dans une tâche puisse conduire à Code Racy s'il n'est pas fait correctement.


@orokusaki: Pas directement via des signaux, car les signaux sont expédiés de manière synchrone. Au lieu d'envoyer le traitement à un autre processus.


@orokusaki, je pense que les tâches 2 et 3 sont de bons candidats à effectuer via des signaux. Peut-être que dans la tâche 2, vous pouvez passer beaucoup de temps pour le téléchargement, car les signaux sont exécutés de manière synchrone, vous pouvez envisager de le faire de manière asynchrone à partir de la demande (sinon l'utilisateur doit également être téléchargé sur S3). ... Cela peut dépendre de la taille de ces images. En ce qui concerne la première tâche ... Eh bien, je n'ai pas compris ce que cela devrait faire ...



4
votes

Voici un exemple qui peut aider.

Supposons que vous ayez besoin d'effectuer une certaine action lorsqu'une instance de modèle est enregistrée. Cependant, cette action n'a rien à voir avec le modèle ou l'instance de modèle elle-même. Par conséquent, il est peu détecté de mettre le code de votre action dans une méthode Sauvegarder () sur le modèle. Cela causerait un couplage de code inutile et un encombrement. Au lieu de cela, vous pouvez créer un gestionnaire de signal ailleurs dans votre application (ou même dans une autre application) où il a plus de sens.


0 commentaires


0
votes

Les signaux ne sont pas asynchrones (ne fonctionnant pas de manière concomitante ou parallèle)

C'est pourquoi ils sont non si utiles pour des choses comme si vous avez mentionnées:

  • Téléchargement de fichier ou fichier post-traitement
  • Rapports Generation
  • Toutes les autres opérations à long terme (demandes à un autre serveur, et)

    C'est mieux travailleurs de céleri pouvant faire des opérations à long terme de manière très asynchrone.

    Mais ils sont toujours utiles dans quelques scénarios limités
    • Extension des fonctionnalités d'une bibliothèque tiers . Si vous utilisez une application avec des modèles dans lesquelles vous ne contrôlez pas le code, les signaux sont une alternative plus robuste à la correction de singe pour prendre des mesures spécifiques sur sauvegarder ou supprimer.
    • Supprimer les signaux fonctionnent sur la méthode Suppr QuerySet . Si vous souhaitez que les mêmes actions se produisent sur des objets uniques et de QuerySet Suppletes, un signal est probablement votre meilleur choix.
      NOTE : En raison de la manière dont le SQL est généré, cela ne s'applique pas à la méthode de la requête de mise à jour (avec sauvegarde des signaux). Une autre source fréquente de confusion / bugs.
    • Lorsque vous devez appliquer le même gestionnaire de signal à de nombreux modèles . Si vous venez d'en avoir quelques-uns, je préférerais toujours remplacer la méthode Save / Supprimer et appeler une fonction partagée. Pour plus de quelques-uns, copier / coller la méthode de sauvegarde partout devient plus sujette d'erreur et les signaux ressemblent à une meilleure option.
    • Éviter les dépendances cross-applications serrées . Si vous devez interrompre les limites des applications, en particulier lorsque la demande peut être utilisée dans plusieurs projets, des signaux peuvent être meilleurs pour le couplage de lâche entre les applications. Soyez prudent avec celui-ci. Utilisez-le parce que vous devez, non pas parce que vous pensez que vous pourriez le vouloir à l'avenir.

      Ces cas et quelques exemples pour eux, vous pouvez trouver dans ce sujet .


0 commentaires