Question

modifier: im pour vous demander si les variables globales sont en sécurité dans un cadre web mono-thread comme tornade

im en utilisant l'ORM mongoengine, qui obtient une connexion de base de données à partir d'une variable globale:

_get_db() # gets the db connection

im en utilisant également une tornade, un framework web python mono-thread. en un point de vue particulier, je dois saisir une connexion de base de données et déréférencer un objet DBRef [similaire à une clé étrangère]:

# dereference a DBRef
_get_db().dereference(some_db_ref)

depuis la connexion retournée par _get_db est une variable globale, est-il une possibilité de collision et la mauvaise valeur retournée au mauvais fil?

Était-ce utile?

La solution

En supposant MongoEngine est enveloppait PyMongo (et je crois qu'il est), alors vous devriez être bien. PyMongo est complètement thread-safe.

Autres conseils

Les threads sont toujours tenus de tenir le GIL lors de l'interaction avec des objets Python. L'espace de noms en maintenant les variables est un objet Python (soit un frameobject ou un dict, selon le type de la variable est.) Il est toujours sûr d'obtenir ou de définir des variables dans plusieurs threads. Vous ne serez jamais obtenir des données d'ordures.

Cependant, les conditions de course habituelles ne s'appliquent à quel objet vous, ou que vous opposez remplacer lorsque vous attribuez. Une déclaration comme x += 1 est pas thread-safe, parce qu'un autre thread peut fonctionner entre le get et le magasin, en changeant la valeur de x, qui alors vous écraser.

Non, mais les serrures sont assez simples à utiliser en python. Utilisez l'essai: enfin:. Modèle pour veiller à ce qu'un verrou est libéré après avoir modifié votre variable globale

Il n'y a rien globals qui les rend plus ou moins thread-safe que toutes les autres variables. Si oui ou non il est possible pour une opération à l'échec ou le retour des résultats incorrects lorsqu'il est exécuté dans différents threads, la meilleure pratique est que vous devez protéger des données partagées entre les threads.

Si je vous en train de lire, vous demandez si une variable est sûre dans un environnement mono-thread. Dans ce cas, où les données sont pas partagé entre les processus simultanés, la variable est sûr (après tout, il n'y a rien d'autre en cours d'exécution qui peut l'interrompre).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top