Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Problème de thread : un lock qui attend trop longtemps

Problème de thread : un lock qui attend trop longtemps

Remonter à Forum général Python
  • Problème de thread : un lock qui attend trop longtemps

    Envoyé par baptiste le 27 Janvier 2007 à 12:50
    Salut,

    J'ai plusieurs threads qui doivent modifier une ressource, j'utilise donc un lock pour leur permettre de faire ça sans se marcher dessus.
    Mais pour vous expliquer mon problème, je dois expliquer un peu la structure de l'application : elle affiche plusieurs images (une image = une classe A). Le thread l'enregistre. Mais elle permet également de changer de page, et donc d'images à afficher. La classe qui instancie toutes ces classes A recrée à chaque fois (chaque changement de page) un objet threading.Lock (qui est transmis à la classe A), et donc qui "écrase" l'ancien. Ceci pour remettre le verrou "à zéro" au changement de page, même s'il y a toujours des threads qui l'attendent. Ça fonctionne, mais le problème avec cette solution, c'est que lock.acquire() fait patienter la fonction jusqu'à que le verrou soit libéré. Mais si il a été écrasé par un autre, le thread attend indéfiniment et ne se termine jamais ! Ce n'est un problème qu'au bout d'un grand nombre de pages, donc de classes A (au bout de la 363e, précisément), ou Python n'arrive plus à créer de threads.
    Il faudrait donc que lock.acquire() s'arrête d'attendre quand une certaine variable (self.thread_actif) devient fausse (passe à False), ce qui intervient au changement de page.
    J'avais pensé à :
    while self.thread_actif:
    if lock.acquire(0) is True:
    break

    Mais mon CPU n'apprécie pas...
    Avez-vous une idée, ou une piste, pour réussir à faire ça ?

    Merci !
    Baptiste.
    • Re: Problème de thread : un lock qui attend trop longtemps

      Envoyé par baptiste le 29 Janvier 2007 à 00:55
      On oublie toutes ces bêtises grâce à Haypo.
      Désolé pour le bruit, grand sachem ;)
    • Re: Problème de thread : un lock qui attend trop longtemps

      Envoyé par haypo le 28 Janvier 2007 à 02:42
    • Re: Problème de thread : un lock qui attend trop longtemps

      Envoyé par baptiste le 28 Janvier 2007 à 11:31
      Oui, j'ai vu ça, mais on ne peut que "débloquer" l'exécution de tous les threads simultanément : donc les 15 (par exemple) ne peuvent acquérir le verrou en même temps... et c'est la même chose.
      threading.Condition semblait aussi convenir, mais leur fonctionnement est obscur :
      http://pastebin.ca/330854

      (counter permet d'identifier le premier thread à lancer)
      Ça ne peut bien sûr pas marcher, vu que quand condition.notify() est lancé, le thread qui le fait est évidemment le seul à avoir acquire()d l'objet Condition. Je ne comprends pas l'utilité de Condition... ou alors comment le faire correctement fonctionner...
Rendu par Ploneboard