OVH Cloud OVH Cloud

bug etrange python

14 réponses
Avatar
ian
Salut a tous,

J'ai un bug tres etrange et je soupconne l'interpreteur (mais j'espere me
tromper)

En gros, j'ai un timeout pour changer un affichage quand on appuie sur une
touche. Le timeout est verifie dans un thread.

Appuie sur une touche > prend time.time() + 5 secondes, et stocke le dans
TOUTAffichage

Jusque la tout va bien. Mais dans le thread, 1 fois sur 20, l'incroyable se
produit, comme dit dans les logs :

2007-03-30 11:07:49,747 SKUtils DEBUG PrintScrStr: Sortie pause
2007-03-30 11:07:49,787 Process DEBUG ThreadCmd - [a passe le test] if
time.time()(1175245669.61) > TOUTAffichage(1175245674.7) and TOUTAffichage
!= 0:
2007-03-30 11:07:49,841 Process DEBUG InitBooking() - TOUTAffichage =
0

et voila le code:
a=time.time()
if (a > TOUTAffichage) and TOUTAffichage != 0:
logging.debug("ThreadCmd - [a passe le test] if time.time()(" + str(a)
+ ") > TOUTAffichage(" + str(TOUTAffichage) + ") and TOUTAffichage != 0:")
InitBooking()

en gros, a < TOUTAffichage, et TOUTAffichage est bien != 0, mais python
passe quand meme dans le IF!

Je suis dans la m.... la non ? :)

Merci

4 réponses

1 2
Avatar
ian
Re tous,

ok au final je vais essayer les locks, meme si au final j'aime pas trop,
s'il faut tout locker, les threads n'ont plus aucune raison d'etre .. enfin
je vous apprend rien :)

Merci
+++



"hg" a écrit dans le message de news:
Bf7Ph.1948$
ian wrote:

et hop une autre thread modifie TOUTAffichage avant la trace !!


Non, tout ce qui modifie TOUTAffichage (a 4 endroits) sont logges tout
pareil.
Donc je suis sur qu'il n'est pas modifie entre temps

J'avais pense a une synchro RTC > heure systeme mais bon, perdre 5
secondes d'un coup, ca me parait gros, surtout aussi souvent :)


Par défaut Python swap tes taches toutes les 10 instructions de base: rien
n'empèche use autre tache de modifier ta variable, puis de perdre le CPU
avant que son logging ne soit exécuté.

Si TOUTAffichage est partagé par ces taches, alors (comme proposé par
Laurent) ... tu dois utiliser "threading.Lock() " lors de toute opération
que tu veux atomique.

hg





Avatar
Maric Michaud
ian wrote:

Il n'y aurait pas un probleme dans les comparaisons des floats ?

Non, on t'a déja donné la réponse, mail de hg, de toute façon, ce que tu

logge *n'est pas* ce que tu teste, donc tant que tu n'aura pas fait cette
modification dans ton code, rien ne sert de chercher des bugs dans
python...



--
_____________

Maric Michaud

Avatar
Laurent Pointal
Re tous,

ok au final je vais essayer les locks, meme si au final j'aime pas trop,
s'il faut tout locker, les threads n'ont plus aucune raison d'etre .. enfin
je vous apprend rien :)


Il ne faut pas tout locker, il faut locker les sections critiques,
celles où tu vas modifier des variables partagées entre plusieurs
threads - sinon tu risque des incohérences, des pertes de données, des
plantages dans certains cas (genre tu testes une condition qui se
vérifie, swap de threads, un autre thread modifie tes variables et
invalide ta condition, reswap de threads, ton thread continue en
considérant une condition qui est devenue fausse).

C'est une des bases de la programmation multithreadée, tu ne pourras pas
y échapper si tu te lances là-dedans.

http://fr.wikipedia.org/wiki/Multithreading
http://fr.wikipedia.org/wiki/Synchronisation_%28multit%C3%A2ches%29

+ de nombreuses ressources sur le ouebe sur synchronisation,
multithreading, sections critiques, mutexs / locks & Co.

A+

Laurent.

Avatar
JBB
Re tous,

ok au final je vais essayer les locks, meme si au final j'aime pas trop,
s'il faut tout locker, les threads n'ont plus aucune raison d'etre .. enfin
c'est les lock qui n'ont pas de raisons d'être sans les thread pas l'inverse !


je vous apprend rien :)

Merci
+++



"hg" a écrit dans le message de news:
Bf7Ph.1948$
ian wrote:

et hop une autre thread modifie TOUTAffichage avant la trace !!
Non, tout ce qui modifie TOUTAffichage (a 4 endroits) sont logges tout

pareil.
Donc je suis sur qu'il n'est pas modifie entre temps

J'avais pense a une synchro RTC > heure systeme mais bon, perdre 5
secondes d'un coup, ca me parait gros, surtout aussi souvent :)
Par défaut Python swap tes taches toutes les 10 instructions de base: rien

n'empèche use autre tache de modifier ta variable, puis de perdre le CPU
avant que son logging ne soit exécuté.

Si TOUTAffichage est partagé par ces taches, alors (comme proposé par
Laurent) ... tu dois utiliser "threading.Lock() " lors de toute opération
que tu veux atomique.

hg









1 2