[python] Vlastní vlákno pro dlouhý výpočet.

RMiklos na pss.sk RMiklos na pss.sk
Pátek Březen 2 13:06:33 CET 2007


Skoda, ze si tu blizsie nespecifikoval charakter funkcie, ktora trva 
prilis dlho. 
Napadlo ma , ze ak sa jedna o nejaky iterativny numericky vypocet, mozes 
rovno do funkcie zamontovat, ze sa prerusi po urcitom maximalnom pocte 
iteracii. 
Ako trivialny priklad tu pouzijem strojove epsilon tzv. macheps, t.j. take 
cislo, ze: macheps + n = n 
Funkcii odovzdam na zaciatku 2 argumenty: startovaciu hodnotu a maximalny 
vypocet iteracii. 
Ak sa presiahne maximalny pocet iteracii funkcia hodi vynimku, ktoru mozes 
dalej spracovat bez threadu, alebo aj s pouzitim threadu:
----------------------------------------------------------
import exceptions
from threading import Thread

# Vynimka
class TooMuchIter(exceptions.Exception):
  def __init__(self, args=None):
    self.args = args

# Wrapper pre class Thread
class MyThread(Thread):
  def __init__(self,myfunc,*arg):
    Thread.__init__(self)
    self.func=myfunc
    self.arg=arg
  def run(self):
    try:
      vysledok_funkcie=self.func
      print "MachEps = %1.20e" % self.func(*self.arg)
    except TooMuchIter,e:
      print "Vypocet predcasne ukonceny: %s" % e

# spustenie funkcie
def run_function(func, *arg):
  try:
    print "Vysledok = %1.20e" % func(*arg)
  except TooMuchIter,e:
    print "Vypocet predcasne ukonceny: %s" % e

# funkcia, ktora sa bude pocitat
def macheps(x, max_iter):
  # vypocet strojovej nuly
  eps=x
  j = 0
  while (eps+1)>1:
    eps=eps/2
    j += 1
    print "krok %2d:  %1.20e" % (j,eps)
    if j > max_iter:
      raise TooMuchIter, "Viac ako %d iteracii !!!" % max_iter
  # return
  return(eps)

if  __name__ == '__main__':
  ### bez pouzitia threadov
  # funkcia sa predcasne ukonci kvoli vela iteraciam
  run_function(macheps,1.0,10)
  # funkcia dobehne do konca
  run_function(macheps,1.0,100)
 
  ### s pouzitim threadov 
  thr1=MyThread(macheps,1.0, 100)
  thr1.start()
  thr1.join()
  thr2=MyThread(macheps,1.0, 20)
  thr2.start()
  thr2.join()
:
----------------------------------------------------------

Ak chces pracovat s threadmi mozno si skus precitat clanok 'Understanding 
Threading in Python' tu: 
http://linuxgazette.net/107/pai.html





"Jakub Vojacek" <jakohv na seznam.cz> 
Sent by: python-bounces na py.cz
01.03.2007 21:54
Please respond to
Konference PyCZ <python na py.cz>


To
"Konference PyCZ" <python na py.cz>
cc

Subject
[python] Vlastní vlákno pro dlouhý výpočet.






Ahoj
 

CHtěl radu ohledně vláken. Dělám na programu, kde chci dát uživateli 
možnost přeuršit výpočet, protože občas by to trvá fakt dlouho. Ale jak to 
naprogramovat. Hledal jsem inspiraci v 
http://wiki.wxpython.org/index.cgi/LongRunningTasks ale nepomohlo to. 
Potřeboval bych aby to vlákno přijalo funkci, kterou musí počítat a když 
by se to dopočítalo tak aby vrátila data
Vlastně by to fungovalo tímto způsobem:
 
vysledek=Vlakno(moje_funkce_s_parametry)
if vysledek != None:#uživatel přeušil výpočet
    zpracuj_vysledek()
 

Děkuji za všechny nápady
 
Blujacker_______________________________________________
Python mailing list
Python na py.cz
http://www.py.cz/mailman/listinfo/python

Mgr. Ing. Roman MIKLÓŠ 
Prvá stavebná sporiteľňa a.s. 
Bajkalská 30, P. O. Box 48 
829 48  Bratislava 25 
Tel.: +421/ 2 / 582 31 174 
Fax: +421/ 2 / 582 31 109 



Další informace o konferenci Python