[python] problem s modulom threading

azurIt azurit na pobox.sk
Čtvrtek Červenec 1 21:04:15 CEST 2004


zdravim,

mam problem, s ktorym si fakt nevjem rady :) chyba je podla mna 
(zase) v pythone ale mozno by sa to dalo spravit aj nejakym inym 
sposobom kedze tymto, ktorym to robim to nejde. mame napriklad script:


import threading
from time import sleep

operations = 10000
max_threads = 100

try:

  for i in range(operations):
    while 1:
      # skontrolujeme ci uz nje je spusteny maximalny pocet threadov
      if threading.activeCount() < max_threads:
        # 'nejaka_funkcia' je proste funkcia, ktora njeco robi
        # a potrebujeme mu spustit n krat
        thrd = threading.Thread(target=nejaka_funkcia)
        thrd.start()
        break
      # ak je, chvilu pockame a skusime znovu (ci uz nejaka z
      # nich nedokoncila pracu)
      else:
        sleep(1)

  print "waiting for all threads to complete.."
  # pockame kym vsetky thready nedokoncja pracu
  while threading.activeCount() != 1:
    sleep(1)
  # teraz mozme napriklad vypisat vysledok scriptu
  ...
  print "dokoncene"

except KeyboardInterrupt:
  print "waiting for all threads to complete.."
  # pockame kym vsetky thready nedokoncja pracu
  while threading.activeCount() != 1:
    sleep(1)
  # teraz mozme spravit napriklad subor, pomocou ktoreho by sa
  # neskor dalo pokracovat tam, kde bola praca prerusena
  ...
  print "prerusene"




ked script prebehne bez prerusenja, tak ide vsetko ok avsak po
preruseni sa mi obcas stalo, ze proste prestal odpovedat a musel som
ho killnut. konecne som objavil kde je chyba.funkcia activeCount z
threading.py:

def activeCount():
    _active_limbo_lock.acquire()
    count = len(_active) + len(_limbo)
    _active_limbo_lock.release()
    return count

v scripte sa tato funkcia pouziva velmi casto
...
while 1:
  if threading.activeCount() < max_threads:
...
a tak sa aj casto stane situacia, ze script prerusime vnutri tejto
funkcie a prave po uzavreti zamku (_active_limbo_lock.acquire()). 
tento zamok sa v module threading pouziva takmer v kazdej funkcii (aj 
pri ukonceni thready) cize ked ostane uzavrety, zjadna z thread 
nemoze pokracovat a preto prestal script odpovedat - cakal kym sa 
uvolni zamok. ten sa vsak uz nikdy neuvolni kedze threada, ktora ho 
uzavrela bola ukoncena KeyboardInterrupt-om a samotny script ku nemu 
nema pristup. nejake napady ako to spravit tak aby to slo dobre ? :) 
podla mna je to jednoznacne chyba v pythone (resp. v module
threading), presne toto iste sa moze stat v hociktorej funkcii z 
modulu threading.

azurIt
____________________________________
http://www.pobox.sk/ - najvacsi slovensky freemail






Další informace o konferenci Python