Programowanie w Sieci Internet Python: Wątki
Transkrypt
Programowanie w Sieci Internet Python: Wątki
Programowanie w Sieci Internet Python: Wątki Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki Wątki – akt pierwszy, kilka przydatnych funkcji Lib/threading.py – modół pozwalający na używanie wątków ● threading.active_count() / threading.activeCount() - zwraca liczbę aktywnych wątków. ● threading.current_thread() / threading.currentThread() - zwraca obecny wątek. ● threading.enumerate() - zwraca listę żywych wątków. ● threading.Event() - zwraca objekt eventu. Posiada on flagę, którą można ustrawić na true za pomocą set(), lub false za pomocą clear(). Metoda wait() blokuje dopuki flaga jest ustawiona na true. ● Threading.Lock() - funkcja zapewniająca locka, dostep do do watku bedzie zablokowany dopuli lock nie zostanie zwolniony. ● threading.Semaphore([val]) – semafor, zwraca ile razy zostało wywołane release() minus liczbę wywołań acquire() plus wartość poczatkową [val] (domyślnie val = 1). ● threading.settrace(func) – ustawia funkcję wołaną przed start(). Akt drugi, klasy powiązane z wątkami ● ● ● ● class threading.Thread – reprezentuje kontrolę wontku, może być rozszezana w pewnym zakresie. class threading.Timer – wątek który jest uruchamiany po wyznaczonym czasie. class threading.local – klasa reprezentująca lokalny blok danych wątku. Thread-local to dane przypisane do konkretnego wątku. Aby wykorzystać lokalne dane, stwóż objekt i umieść w nim swoje atrybuty. Dane dostępne z interfejsu będą się różnić w zależności od wątku. exception thrading.ThreadError – wyjątek rzucany przy różnych zdarzeniach zwiazanych z wątkami. Akt 3, co można zrobić w wątku run() to funkcja która wykonuje się podczas aktywności wątku. Pisząc swój wątek nadpisujemy ją i nadajemy jej jakiś sens oraz pracę do wykonania. Jest to jedyna funkcja którą powinniśmy nadpisywać rozrszeżająć klasę Thread. start() tej funkcji używamy do uruchamienia wątku, a ona rozpoczyna pracę poprzez uruchomienie funkcji run() dając kontrolę nad wątkiem. Kiedy wątek wystartuje, jest uznawany za żywy, aż do momentu gdy metoda run() zakończy swoje dzialanie (czy to w sposób naturalny, czy poprzez rzucenie nieobsłuzonego wyjątku. jojn([timeout]) wiąże wątki, dzięki czemu wątek wołany jest blokowany aż do momentu zakończenia działania wątku wołającego. Jeśli podany jest argument timeout, to wątek jest odblokowany po zakończeniu wątku wołającego, lub czasie timeout w sekundach. Akt 3 ciąg dalszy name – to string identyfikujący wątek. Wiele wątków może mieć tą samą nazwę. Początkowa nazwa jest nadawana przez konstruktor. getName() i setName() to api do zarzadzania nazwą wątków. Ident – identyfikator wątku. Jest to liczba całkowita, niezerowa nadawana w momencie wystartowania wątku (gdy wątek jest powołany do życia. Przed ożyciem wątku, ma wartość None. Ident jest dostępny nawet po zakonczeniu życia wątku. is_alive() / isAlive() - mówi czy wątek ma status alive. daemon / isDaemon(), setDaemon() wątek typu daemon nie zatrzyma zakończenia programu Pythona. Domyślna wartość to false. Aby ustawić ją na true należy zrobić to przed uruchomienim funkcji start(), w przeciwnym wypadku run() rzuci wyjątkiem RuntimeError. Akt 4, użycie import threading def worker(num): """thread worker function""" print 'Worker: %s' % num return threads = [] for i in range(5): t = threading.Thread(target=worker, args=(i,)) threads.append(t) t.start() class myThread (threading.Thread): def __init__(self, threadID, name, counter): threading.Thread.__init__(self) self.threadID = threadID self.name = name self.counter = counter def run(self): print "Starting " + self.name print_time(self.name, self.counter, 5) print "Exiting " + self.name def print_time(threadName, delay, counter): if exit_condition: thread.exit() time.sleep(delay) print "%s: %s" % (threadName, time.ctime(time.time())) counter -= 1 # Create new threads thread1 = myThread(1, "Thread-1", 1) thread2 = myThread(2, "Thread-2", 2) # Start new Threads thread1.start() thread2.start() print "Exiting Main Thread" Dziękuję za uwagę!