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!
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
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" <hg@nospam.org> a écrit dans le message de news:
Bf7Ph.1948$YJ4.1704@newsfe23.lga...
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.
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
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
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...
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
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.
+ de nombreuses ressources sur le ouebe sur synchronisation, multithreading, sections critiques, mutexs / locks & Co.
A+
Laurent.
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.
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.
+ de nombreuses ressources sur le ouebe sur synchronisation, multithreading, sections critiques, mutexs / locks & Co.
A+
Laurent.
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
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" <hg@nospam.org> a écrit dans le message de news:
Bf7Ph.1948$YJ4.1704@newsfe23.lga...
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.
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.