Je remarque qu'il est souvent suggéré d'utiliser des files d'attente avec plusieurs bandes de roulement, au lieu de listes et de .pop (). Est-ce parce que les listes ne sont pas thread-safe ou pour une autre raison?
Réponses
Trop de publicités?Les listes se sont thread-safe. Dans Disponible le GIL protège contre les accès concurrents à eux, et d'autres implémentations de prendre soin d'utiliser un verrou de granularité fine ou en parallèle, un type de données pour la liste des implémentations. Cependant, alors que les listes elles-mêmes ne peuvent pas aller corrompre par des tentatives d'accéder simultanément, les listes de données n'est pas protégé. Par exemple:
L[0] += 1
n'est pas garanti pour augmenter L[0] par un si un autre thread fait la même chose, parce qu' +=
n'est pas une opération atomique. (Très, très peu d'opérations en Python sont effectivement atomique, parce que la plupart d'entre eux peuvent provoquer arbitraire de code Python pour être appelé.) Vous devez utiliser les Files d'attente parce que si vous venez d'utiliser une liste non protégés, vous pouvez obtenir ou supprimer le mauvais article, en raison de conditions de course.
Pour clarifier un point de l'excellente réponse de Thomas, il convient de mentionner que append()
est thread-safe.
C'est parce qu'il n'y a aucune inquiétude que les données en cours de lecture soient au même endroit une fois que nous allons y écrire . L'opération append()
ne lit pas les données, elle les écrit uniquement dans la liste.
Voici une liste complète mais non exhaustive d'exemples d'opérations list
et indiquant si elles sont ou non thread-safe. En espérant obtenir une réponse concernant la construction de langage obj in a_list
ici .