2010-11-22 6 views
3

Si je lis la documentation de django, seuls les documents concernant les balises de gabarit mentionnent le danger potentiel de la sécurité des threads.Django et la sécurité des threads

Cependant, je suis curieux de savoir ce genre de choses que je dois faire/éviter d'écrire du code thread-safe dans Django ...

Un exemple est, j'ai la fonction suivante config les enregistreurs utilisés dans django.

_LOGGER_CONFIGURED = False 

def config_logger(): 
    global _LOGGER_CONFIGURED 
    if _LOGGER_CONFIGURED: return 
    _LOGGER_CONFIGURED = True 

    rootlogger = logging.getLogger('') 
    stderr_handler = StreamHandler(sys.stderr) 
    rootlogger.addHandler(stderr_handler) 

et à la fin de mon URLconf racine, j'ai l'appel de la fonction suivante:

config_logger() 

La question est:

  1. Est-ce threadsafe code? Quels types de variables sont partagés entre les threads django?

+0

Vous voulez dire le danger potentiel de l'insécurité de fil: p – Edmund

+0

Je pense qu'il y a des endroits potentiels pour l'insécurité de fil (certains d'entre eux sont pointés par des personnes). -urlresolver utilise un dictionnaire modifiable globalement, et cet objet peut être mis dans un état indéterminé si des requêtes simultanées se produisent au démarrage du serveur. -plusieurs classes de formes et de champs django ont des compteurs globaux ... je ne sais pas comment ils sont utilisés, mais il ne semble pas que l'accès à ceux-ci ne soit pas protégé par des mutex. Je suppose que cela peut être potentiellement dangereux. –

Répondre

1

Il n'y a pas vraiment beaucoup que vous pouvez faire sur les modèles de django et leurs problèmes avec filetage, en plus de ne pas les utiliser, ou au moins de ne pas utiliser les balises qui sont sensibles à filetage questions. Il n'y a pas beaucoup de balises de gabarit django qui ont des problèmes, seulement celles qui le sont, comme cycle. Dans l'exemple que vous avez donné, vous ne faites rien pour la sécurité des threads, et vous ne devriez pas l'être: le module logging est déjà parfaitement sûr pour les threads, à condition que vous l'utilisiez normalement, ce qui est pour appeler logging.getLogger dans les modules qui en ont besoin, et LOGGING ou LOGGING_CONFIG est set appropriately dans votre settings.py. Pas besoin d'être intelligent avec ça.

D'autres choses qui pourraient vous préoccuper sont l'intégrité de la base de données face aux mises à jour simultanées. Ne soyez pas, si vous utilisez des bases de données PostgreSQL ou MySQL/INNOdb, alors vous êtes complètement protégé contre les shennanegans concurrents.

+0

Je connaissais LOGGING et LOGGING_CONFIG, mais j'utilise django 1.2.3. –

+0

Je suppose que la question est: je ne sais pas ce que sont les variables globales, et ce ne sont pas des variables globales dans django ... seule chose qui me semble évidente est la variable 'request' dans les gestionnaires de requêtes. Cependant, si vous avez juste une variable dans views.py, est-ce global parmi tous les threads? –

+1

Ce commentaire semble un peu large: "D'autres choses que vous pourriez être préoccupé par l'intégrité de la base de données. [...] Ne soyez pas." Bien sûr, le SGBD hôte peut gérer tous les problèmes de concurrence, mais j'utilise PyODBC comme accès à la base de données Django, et PyODBC déclare expressément que vous pouvez utiliser le même module à partir de nombreux threads, mais PAS le même objet "connection". A moins de se perdre dans le code de Django, quelqu'un peut-il me dire si Django gère correctement ce problème de BD - et d'autres similaires? –

Questions connexes