[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