2010-09-15 9 views
4

J'ai un programme Python/wxPython où l'interface graphique est le thread principal et j'utilise un autre thread pour charger les données d'un fichier. Parfois, les fichiers sont gros et lents à charger, donc j'utilise une boîte de dialogue wxPulse pour indiquer la progression. Lorsque je charge le fichier, je compte le nombre de lignes lues dans le thread de comptage et j'affiche ce nombre dans la boîte de dialogue wxPulse du thread principal. Je reçois le compte dans le thread principal en lisant la même variable qui est écrite par le thread de chargement.Python: sûr de lire les valeurs d'un objet dans un thread?

Est-ce "thread safe"? Cela pourrait-il causer des problèmes? Je l'ai fait pendant un certain temps et ça s'est bien passé jusqu'à présent.

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

+0

Utilisez une [queue] (http://docs.python.org/library/queue.html), ils sont extrêmement faciles à utiliser. – Seth

+0

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

+0

Tout le monde: merci pour les bonnes réponses tout autour. Dommage que je ne peux en choisir qu'un. –

Répondre

5

En général, aussi longtemps que ...

  • Vous avez seulement une écriture de fil à, et ...
  • Il est pas important que le nombre soit maintenu avec précision en phase avec la valeur affichée ..

c'est bon.

1

C'est très bien car vous n'avez qu'un seul thread d'écriture. Les opérations en lecture seule sont toujours thread-safe. L'exception à cette règle se produit lorsque vous lisez plusieurs valeurs associées et que vous attendez une forme de cohérence entre elles. Comme les écritures peuvent se produire à tout moment, les lectures de plusieurs valeurs peuvent ne pas être cohérentes et même n'avoir aucun état de programme sensible. Dans ce cas, les verrous sont utilisés pour faire apparaître plusieurs lectures comme une seule opération atomique exclusive à toute écriture.

0

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

1

C'est assez sûr. Lorsque le nombre augmente de n à n + 1, l'objet "n + 1" est créé et le compte est alors passé de "n objet" à "nouvel objet n + 1".

Il n'y a pas de stade qui comptent fait référence à autre chose que le « objet n » ou « n + 1 objet »

2

En python normale, ce sera sûr que tous les accès aux variables sont protégées par le GIL (Global Interpreter Lock) Cela signifie que tous les accès à une variable sont synchronisés de sorte qu'un seul thread peut le faire à la fois. Le seul problème est que @Eloff a noté si vous avez besoin de lire plus d'une valeur et que vous avez besoin d'être cohérent - vous aurez besoin de concevoir un certain contrôle d'accès dans ce cas.