2010-11-05 2 views
3

Je me demande s'il y a des implications sérieuses que je pourrais créer moi-même en utilisant des threads locaux. J'ai remarqué que dans le cas de Flask, they use thread locals, et mentionner qu'il peut causer des problèmes avec les serveurs qui ne sont pas construits avec des threads à l'esprit. Est-ce une préoccupation obsolète? J'utilise les locaux de fil avec Django pour un certain nombre de choses, avec le déploiement Nginx devant uwsgi ou gunicorn, sur Ubuntu 10.04 avec Postgres (pas que le système d'exploitation ou DB importance probablement, mais juste pour plus de clarté). Dois-je être inquiet?Les habitants de Thread en Python - négatifs, en ce qui concerne l'évolutivité?

+0

Si vous êtes inquiet au sujet du rendement, juste vous-même référence. Je ne m'attends à aucun problème. –

Répondre

1

Threadlocals ne sont pas la façon la plus robuste ou sûr de faire les choses - consultez this note, par exemple. [Bien que voir également le commentaire de Glenn, ci-dessous]

Je suppose que si vous avez codé proprement, avec l'idée que vous mettez des choses dans un grand pot d'informations, en acceptant la cohérence des données non garanties dans ces locaux threaded et en prenant soin de éviter les conditions de course, etc, etc, vous pourriez bien être ok. Mais, même dans cet état d'esprit, il y a toujours la «magie» des variables locales threadées, donc documenter clairement ce qui se passe et chaque fois qu'une variable threadedlocal est utilisée pourrait vous aider/futurs développeurs de la base de code sur toute la ligne.

+4

Cette note est tout simplement un mauvais conseil. Les variables locales thread sont une excellente solution pour des choses comme le stockage des informations de l'utilisateur actuel. Assurez-vous simplement d'effacer toutes les variables locales thread dans votre middleware d'exception. Les globals ne sont pas plus intrinsèquement mauvais que ceux de C; ils ont juste besoin d'être utilisés avec soin. –

+0

+1 Glenn. Je suppose que c'était l'idée maîtresse de ce que je disais: faites-le avec soin, et documentez-le clairement, puis vous réduisez le risque de voir les bugs sains et saufs –

+0

merci. J'évite les conditions de concurrence en utilisant une fonction pour obtenir des valeurs seulement dans le contexte où les intergiciels de threads locaux ont déjà été lancés. – orokusaki