2010-09-18 11 views
3

Pourquoi la sécurité des threads est-elle importante dans une application Web? Pylons (framework web Python) utilise une variable d'application globale qui n'est pas thread-safe. Est-ce que cela compte? Est-ce seulement un problème si j'ai l'intention d'utiliser le multi-threading? Ou, cela signifie-t-il qu'un utilisateur pourrait ne pas avoir l'état mis à jour si un autre utilisateur ... Je suis juste confus moi-même. Qu'est-ce qui est si important avec ça?Fil d'applications Web sécurisées - pourquoi est-ce important?

Répondre

2

erreurs Threading peuvent conduire à des problèmes graves et subtils.

Supposons que votre système compte 10 membres. Un autre utilisateur s'inscrit à votre système et l'application l'ajoute à la liste et augmente le nombre de membres; "simultanément", un autre utilisateur se ferme et l'application le supprime de la liste et décrémente le nombre de membres.

Si vous ne gérez pas le filetage correctement, votre nombre de membres (qui devrait être de 10) pourrait facilement être neuf, 10 ou 11, et vous ne pourrez jamais reproduire le bug.

Alors soyez prudent.

+0

Votre scénario suppose-t-il que je stocke l'état pour plusieurs utilisateurs Web demandeurs en mémoire, par rapport à la base de données? Si tel est le cas, ce n'est peut-être pas un casse-tête aussi important car j'ai tendance à pencher vers la solution la plus lente mais la plus simple en gérant tout cela à travers la base de données. – orokusaki

+0

pouvez-vous parler sur Pylons à ce sujet? – orokusaki

+0

Je parlais seulement de problèmes de filetage dans l'abstrait. Faire tout le travail dans la base de données (probablement threadsafe), ne résout pas le problème. Par exemple, si vous incrémentez imprudemment le nombre de membres - lisez le nombre à partir de la base de données, incrémentez le nombre, écrivez le nombre dans la base de données - vous rencontrerez probablement un problème de thread. – Malvolio

1

Vous devriez se soucier de la sécurité des threads. Par exemple, en Java, vous écrivez une servlet qui fournit certaines fonctionnalités. Le conteneur déploiera une instance de votre servlet et, à mesure que les requêtes HTTP arrivent des clients, via différentes connexions TCP, chaque requête est traitée par un thread séparé qui appelle à son tour votre servlet. Par conséquent, votre servlet sera appelé à partir de plusieurs threads. Donc, si ce n'est pas thread-safe, alors le résultat erroné sera retourné à l'utilisateur, en raison de la corruption des données d'accès aux données partagées par les threads.

+0

@ user384706 - Savez-vous quel est l'équivalent d'une servlet en Python? Une application WSGI est-elle l'équivalent de base? – orokusaki

+1

@orokusaki: Je ne connais pas Python donc je ne sais pas. Mais généralement, tous les frameworks spécifient s'ils sont thread-safe. Par exemple. struts2 spécifie qu'ils sont thread-safe. C'est à dire. pour chaque requête client, chaque thread affecté à chaque nouvelle connexion utilise une nouvelle instance de la classe d'implémentation. Pour les servlets, les instances sont partagées entre les connexions, c'est-à-dire les threads. N'est-ce pas spécifié en Python? Si ce n'est pas le cas, alors je pense qu'il vaudrait mieux supposer, thread-unsafe et synchroniser l'accès aux données partagées. Analysez simplement le code pour vous assurer que la performance est correcte. – Cratylus

1

Cela dépend vraiment du cadre d'application (que je ne sais rien dans ce cas) et comment le serveur Web traite il. Évidemment, tout bon serveur web va répondre simultanément à plusieurs requêtes, donc il fonctionnera avec plusieurs threads. Ce serveur Web peut envoyer à une instance unique de votre code d'application pour toutes ces demandes, ou il peut générer plusieurs instances de votre application Web et ne jamais utiliser une instance donnée simultanément.

Même si le serveur d'application n'utilise des instances distinctes, votre demande sera probablement un état partagé - dire, une base de données avec une liste d'utilisateurs. Dans ce cas, vous devez vous assurer que l'état peut être consulté en toute sécurité à partir de plusieurs threads/instances de votre application Web.

Ensuite, bien sûr, il y a le cas où vous utilisez le filetage explicitement dans votre application. Dans ce cas, la réponse est évidente.

1

Votre application Web est multithreading presque toujours. Même si vous n'utilisez pas explicitement les threads. Donc, pour répondre à vos questions: c'est très important.

Comment cela peut-il arriver? Habituellement, Apache (ou IIS) servira plusieurs requêtes simultanément, en appelant plusieurs fois à partir de plusieurs threads vos programmes python. Vous devez donc considérer que vos programmes s'exécutent simultanément dans plusieurs threads et agir en conséquence.

+0

Mais, je ne comprends pas. Comment cela me concerne? L'état est stocké dans ma base de données, alors pourquoi est-ce important? Quel changement se produirait dans un thread qui pourrait gâcher l'exécution d'un autre thread? C'est ce que je ne comprends pas. Aussi, pouvez-vous parler sur Pylons? – orokusaki

+1

@crokusaki vous semblez confondre l'état persistant et demander un état spécifique. Votre db peut gérer l'état persistant mais ne peut pas gérer l'état spécifique de la requête. Dites que vous avez une variable appelée code postal qui est initialisée au code postal entré par un utilisateur dans un formulaire. Si le thread est dangereux (c'est-à-dire si une seule instance de cette variable est stockée sur plusieurs threads), le code postal d'un deuxième utilisateur risque de corrompre cette variable, auquel cas toute votre logique serait gâchée. Peut livrer les affaires d'un utilisateur à un autre utilisateur! –

+0

@raja - ok. Donc, fondamentalement, je pourrais avoir un framework web qui prend une variable de paramètres et l'applique à l'état du framework, au lieu de lier une sorte d'état thread-safe à la requête unique. Ensuite, un utilisateur arrive et voit les effets des paramètres d'un autre utilisateur? – orokusaki

1

(C'était trop long pour ajouter un commentaire aux autres réponses fines.)

problèmes d'accès concurrents (lire: accès multiple à l'état partagé) est un super-série de problèmes de filetage. Les (problèmes de concurrence) peuvent facilement exister à un niveau "supérieur au thread" tel qu'un niveau processus/serveur (la variable globale dans le cas mentionné ci-dessus est une valeur unique, ce qui peut entraîner une vue/état incohérent si il y a plusieurs processus).

Il faut prendre soin d'analyser les exigences de cohérence des données, puis implémenter le logiciel pour répondre à ces exigences. Je me trompe toujours du côté du coffre-fort, et ne me dégrade que dans les zones soigneusement analysées où c'est acceptable. Cependant, notez que CPython n'exécute qu'un seul contexte de thread pour l'exécution de code Python (pour obtenir les vrais threads simultanés, vous devez écrire/utiliser des extensions C), donc, alors que vous pouvez obtenir une forme de condition de course sur les données attendues, n'obtiendront pas (tous) le même type de scénarios d'écriture partielle et tels que ceux qui peuvent affecter les programmes C/C++. Mais, encore une fois. Err sur le côté d'une vue cohérente.

Il existe un certain nombre de méthodes existantes permettant d'accéder à des processus ou à des processus atomiques globaux. Utilise les.