6
votes

Python: Coffre-fort de lire des valeurs d'un objet dans un fil?

J'ai un programme Python / WXPython où l'interface graphique est le fil principal et j'utilise un autre thread pour charger des données à partir d'un fichier. Parfois, les fichiers sont grands et lents à charger, donc j'utilise une boîte de dialogue WXpulse pour indiquer les progrès.

Lorsque je charge le fichier, je compte le nombre de lignes qui ont été lues dans le fil de comptage et j'affiche ce nombre dans la boîte de dialogue WXPULSE dans le fil principal. Je reçois le compte dans le fil principal en lisant la même variable qui est écrite par le fil de chargement.

est-ce que ce "fil sûr"? Cela pourrait-il causer des problèmes? Je le fais depuis un moment et ça va jusqu'à présent.

ps. Je sais que je pourrais utiliser une file d'attente pour transférer le comte, mais je suis paresseux et que je ne veux pas si je n'ai pas besoin.


2 commentaires

Utilisez un Queue , ils sont extrêmement faciles à utiliser.


@Seth: J'ai utilisé des files d'attente pour d'autres choses et d'accord, ils sont faciles à utiliser. On dirait que je n'ai pas besoin d'une file d'attente pour cette situation particulière et il serait donc préférable de ne pas encombrer le code avec des fonctionnalités inutiles.


5 Réponses :


8
votes

Généralement aussi longtemps que ...

  • Vous n'avez qu'un seul fil écrit, et ...
  • Il n'est pas important que le comte soit maintenu précisément en synchronisation avec la valeur affichée ...

    C'est bien.


0 commentaires

2
votes

C'est bien parce que vous n'avez qu'un seul fil écrivain. En savoir que seules les opérations sont toujours en sécurité. L'exception à cela se produit lorsque vous lisez plus d'une valeur liée et attendez une forme de cohérence entre elles. Étant donné que les écritures peuvent arriver à tout moment, les lectures de valeurs multiples peuvent ne pas être cohérentes et même peut même avoir un état de programme sensible du tout. Dans ce cas, les verrous sont utilisés pour que les multiples lectures apparaissent comme une seule opération atomique exclusive à toutes les écrivies.


0 commentaires

0
votes

C'est sûr que parce que ce n'est pas particulièrement critique. Des choses étranges comme la valeur ne mettant pas à jour quand cela ne devrait pas d'importer. Il est très difficile d'obtenir une réponse définitive sur ce qui se passe lorsque vous prétendez un seul INT qui est lu et écrit est «atomique», car cela dépend de l'architecture exacte et d'un groupe d'autres choses. Mais cela ne fera rien de pire que de donner le mauvais numéro parfois, alors allez-y ... ou utilisez une file d'attente. :)


0 commentaires

1
votes

C'est assez sûr.

Lorsque le comte augmente de N à N + 1 L'objet "N + 1" est créé, puis le décompte est activé de référence à "N objet" à l'autre objet "N + 1".

Il n'y a pas de stade qui compte se réfère à quelque chose d'autre que "N Object" ou "N + 1 Object"


0 commentaires

3
votes

Dans le python normal, cela sera sécurisé car tous les accès aux variables sont protégés par le GIL (verrouillage d'interpréteur global). Cela signifie que tous les accès à une variable sont syncronisés de sorte que un seul thread peut le faire à la fois. Le seul problème est que @Eloff a noté si vous devez lire plus d'une valeur et avoir besoin d'être cohérents - vous devrez concevoir un contrôle de l'accès dans ce cas.


0 commentaires