Threads Python - Section critique
Qu'est-ce que la "section critique" d'un thread (en Python)?
Un fil entre la section critique
en appelant le acquire() la méthode, qui
peut être le blocage ou la
non-bloquant. Un thread s'arrête la
section critique, par l'appel de la
méthode release ().
- La compréhension de Filetage en Python, Linux Gazette
Aussi, quel est le but d'une serrure?
source d'informationauteur Devoted
Vous devez vous connecter pour publier un commentaire.
Une section critique de code est celui qui ne peut être exécuté que par un seul thread à la fois. Prendre un serveur de chat par exemple. Si vous avez un thread pour chaque connexion (c'est à dire, chaque utilisateur final), une "section critique" est le gestionnaire d'impression de code (envoi d'un message entrant pour tous les clients). Si plus d'un thread tente de spool un message à la fois, vous obtiendrez BfrIToS mANtwD PIoEmesCEsaSges entremêlées, ce qui n'est évidemment pas bon du tout.
Un verrou est quelque chose qui peut être utilisé pour synchroniser l'accès à une section critique (ou des ressources en général). Dans notre serveur de chat exemple, le verrouillage est comme une pièce fermée avec une machine à écrire. Si un thread est là (à taper un message), aucun autre thread ne peut pénétrer dans la salle. Une fois que le premier thread est fait, il déverrouille la salle et les feuilles. Puis un autre thread peut aller dans la chambre (verrouillage). "L'acquisition" de la serrure signifie simplement "je obtenir la chambre."
D'autres personnes ont donné de très belle définition. Voici l'exemple classique:
Disons que le
+=
opérateur se compose de trois volets:Si vous n'avez pas le
with account_balance_lock
déclaration et que vous exécutez deuxchange_account_balance
appels en parallèle, vous pouvez finir par l'entrelacement de trois sous-composant opérations de façon dangereuse. Disons que vous appeler simultanémentchange_account_balance(100)
(AKA pos) etchange_account_balance(-100)
(AKA neg). Cela pourrait se produire:Parce que vous ne les force pas les opérations d'arriver en petits morceaux discrets, vous pouvez avoir trois résultats possibles (-100, 0, 100).
La
with [lock]
s'agit d'un énoncé unique, indivisible opération qui dit, "Laissez-moi être le seul fil de l'exécution de ce bloc de code. Si quelque chose d'autre est en cours d'exécution, c'est cool -- je vais l'attendre." Cela garantit que les mises à jour de laaccount_balance
sont "thread-safe" (parallélisme).Remarque: Il ya un inconvénient à ce schéma: vous avez à retenir pour acquérir la
account_balance_lock
(viawith
) à chaque fois que vous souhaitez manipuler lesaccount_balance
pour que le code reste thread-safe. Il existe des moyens de rendre cela moins fragile, mais c'est la réponse à une autre question.Edit: En rétrospective, il est probablement important de mentionner que la
with
déclaration appelle implicitement un blocageacquire
sur le lock-c'est la plus "je vais attendre" une partie du fil au-dessus de dialogue. En revanche, un non-bloquant acquérir dit, "Si je ne peux pas acquérir le verrou tout de suite, laissez-moi savoir," et puis compte sur vous pour vérifier si vous avez obtenu le verrouiller ou pas.Je tiens également à ajouter que le verrou principal objectif est de garantir l'atomicité de l'acquisition, de l'indivisibilité de la
acquire
dans les threads), qui est un simple indicateur booléen ne sera pas garantie. La sémantique des opérations atomiques sont probablement aussi le contenu d'une autre question.Un "section critique" est un bloc de code dans lequel, pour la correction, il est nécessaire de s'assurer que seul un thread de contrôle peut être dans la section à la fois. En général, vous avez besoin d'une section critique pour contenir des références qui écrire des valeurs dans la mémoire, qui peut être partagée entre plusieurs processus simultanés.