Zaawansowany kurs języka Python



Podobne dokumenty
Kurs rozszerzony języka Python

Kurs języka Python. Wątki

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

Programowanie w Ruby

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

Wątki i komunikacja między nimi w języku Python

Kurs programowania. Wykład 8. Wojciech Macyna

Język Java wątki (streszczenie)

Bezbolesne Programowanie Współbieżne

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Zaawansowany kurs języka Python

Współbieżność w środowisku Java

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Kurs rozszerzony języka Python

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Plan. krótkie opisy modułów. 1 Uwagi na temat wydajności CPython a. 2 Podstawowe techniki poprawiające wydajność obliczeniową

Mechanizmy pracy równoległej. Jarosław Kuchta

Aplikacje w Javie- wykład 11 Wątki-podstawy

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

Kurs języka Python. Wykład 11. Marcin Młotkowski. 4 stycznia Kontrola poprawności podczas biegu programu. 2 Testowanie oprogramowania

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Zaawansowane programowanie w C++ (PCP)

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Podstawy współbieżności

Język Java wątki (streszczenie)

Wątki w Javie. Piotr Tokarski

Programowanie i projektowanie obiektowe

Zaawansowany kurs języka Python

Programowanie obiektowe

Szablony funkcji i szablony klas

Kurs języka Python. Wykład 5. Marcin Młotkowski. 9 listopada Rodzaje parametrów funkcji. 2 Biblioteka Tk. 3 Układanie kontrolek w oknie

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Współbieżność w Javie

Współbieżność w Javie

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Zaawansowany kurs języka Python

Wstęp do programowania

System operacyjny MACH

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Wstęp do programowania

Wielowątkowość. Programowanie w środowisku rozproszonym. Wykład 1.

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

procesów Współbieżność i synchronizacja procesów Wykład prowadzą: Jerzy Brzeziński Dariusz Wawrzyniak


Hackowanie zamrożonych binariów

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Dekoratora używa się wstawiając linijkę zaczynającą się przed definicją dekorowanego obiektu (klasy czy funkcji).

Programowanie komputerów

Programowanie i projektowanie obiektowe

Wstęp do programowania

Wzorce logiki dziedziny

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Programowanie obiektowe

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

Kurs języka Python Wykład 8. Przetwarzanie tekstu Wyrażenia regularne Biblioteka urllib Parsowanie html'a XML

Programowanie wielowątkowe. Tomasz Borzyszkowski

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Zaawansowany kurs języka Python

Tworzenie i wykorzystanie usług

Programowanie współbieżne i rozproszone

WIELOWĄTKOWOŚĆ. Waldemar Korłub. Platformy Technologiczne KASK ETI Politechnika Gdańska

Systemy operacyjne. Zajęcia 11. Monitory

Wywoływanie metod zdalnych

Java. Programowanie Obiektowe Mateusz Cicheński

Zaawansowany kurs języka Python

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

Język Java część 2 (przykładowa aplikacja)

Programowanie i projektowanie obiektowe

Programowanie współbieżne Wykład 5. Rafał Skinderowicz

Język Java część 2 (przykładowa aplikacja)

Task Parallel Library

Wstęp do programowania

Programowanie obiektowe

Wykresy i interfejsy użytkownika

Zaawansowany kurs języka Python

Programowanie obiektowe

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Kurs języka Python. Wykład 13. Marcin Młotkowski. 18 stycznia Rozszerzenia Pythona w C Python/C API. 2 Osadzanie Pythona w C

Wprowadzenie do szablonów szablony funkcji

Wywoływanie metod zdalnych

Programowanie współbieżne Wykład 7. Iwona Kochaoska

Przegląd języka Python. Łukasz Anwajler

Wprowadzenie do szablonów szablony funkcji

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Metaprogramowanie w Ruby

Wprowadzenie do programowania

Programowanie i projektowanie obiektowe

Języki i metody programowania Java. Wykład 2 (część 2)

Kurs rozszerzony języka Python

Java: otwórz okienko. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

Transkrypt:

Wykład 6. 6 listopada 2015

Plan wykładu Callable objects 1 Callable objects 2 3

Plan wykładu Callable objects 1 Callable objects 2 3

Callable objects Wszystko jest obiektem.

Callable objects Wszystko jest obiektem. A funkcje?

Przykład Callable objects def foo(x): return 2*x dir(foo)

Przykład Callable objects def foo(x): return 2*x dir(foo) [ call, class, closure, code, defaults, name,...]

Callable objects Elementy wykonywalne (ang.callable) Są to te elementy języka Python, które można wywoływać jak funkcję.

Callable objects Elementy wykonywalne (ang.callable) Są to te elementy języka Python, które można wywoływać jak funkcję. Przykłady: funkcje i metody wbudowane; funkcje zdefiniowane przez użytkownika; metody obiektu; klasy (tworzenie nowego obiektu); obiekty implementujące metodę call.

Callable objects Przykład obiektu wykonywalnego class Potrojenie: def call (self, n): return self.podwojenie(n) + n def podwojenie(self, n): return n + n trojka = Potrojenie() for n in range(4): print( 3*{0} = {1}.format(n, trojka(n)))

Własny licznik Callable objects Potrzebuję licznika licznik() # zwraca 1 licznik() # zwraca 2 licznik() # zwraca 3

Własny licznik Callable objects Potrzebuję licznika licznik() # zwraca 1 licznik() # zwraca 2 licznik() # zwraca 3 class Licznik: def init (self): self.licznik = 0 def call (self): self.licznik += 1 return self.licznik licznik = Licznik()

Plan wykładu Callable objects 1 Callable objects 2 3

Wstęp Callable objects Z Wikipedii: Wątek (ang. thread) to jednostka wykonawcza w obrębie jednego procesu, będąca kolejnym ciągiem instrukcji wykonywanym w obrębie tych samych danych (w tej samej przestrzeni adresowej). tego samego procesu korzystają ze wspólnego kodu i danych, mają jednak oddzielne stosy.

Po co używać wątków Callable objects zrównoleglenie wolnych operacji wejścia/wyjścia (ściąganie pliku/obsługa interfejsu) jednoczesna obsługa wielu operacji, np. serwery WWW

Callable objects Przykładowe obliczenie programu dwuwątkowego Przykład 1. Przykład 2. Wątek I i = i + 1 print i i = i + 1 print i i = i + 1 print i Wątek II i = i + 1 print i i = i + 1 print i i = i + 1 print i Wątek I i = i + 1 print i i = i + 1 print i i = i + 1 print i Wątek II i = i + 1 print i i = i + 1 print i i = i + 1 print i

Callable objects Moduły wątków w Pythonie thread (3.*: thread): niskopoziomowa biblioteka threading: wysokopoziomowa biblioteka, korzysta z thread;

Callable objects Moduły wątków w Pythonie thread (3.*: thread): niskopoziomowa biblioteka threading: wysokopoziomowa biblioteka, korzysta z thread; dummy thread dummy threading multiprocessing concurrent.futures

Jak korzystać z wątków Callable objects moduł threading class Thread: def run(self): Operacje wykonywane w wątku def start(self): Wystartowanie obliczeń w wątku

Przykładowe zadanie Callable objects Zasymulowanie za pomocą wątków biegaczy w maratonie.

Callable objects Implementacja klasy biegaczy import threading total distance = 0 class runner(threading.thread): def init (self, nr startowy): self.numer = nr startowy threading.thread. init (self)

Implementacja biegu Callable objects class runner, cd def run(self): global total distance dystans = 42195 while dystans > 0: dystans = dystans - 1 total distance = total distance + 1 if dystans % 10000 == 0: print ( Zawodnik nr {0}.format(self.numer)) print ( Zawodnik {0} na mecie.format(self.numer))

Rozpoczęcie biegu Callable objects r1 = runner(1) r2 = runner(2) r1.start() r2.start() r1.join() r2.join() print ( koniec wyścigu, dystans {0}.format(total distance))

Rola.join Callable objects Główny program to też wątek, więc po wywołaniu są dwa wątki r1.start() r1.join() oznacza, że wątek nadrzędny będzie czekał na zakończenie wątku r1

Tworzenie wątków Callable objects Podsumowanie tworzymy dziedzicząc po klasie Thread.

Callable objects Inny sposób tworzenia wątków wątek = Thread(target=callable, args=sekwencja)

Callable objects Inny sposób tworzenia wątków wątek = Thread(target=callable, args=sekwencja) import threading wątek = threading.thread(target=pow, args=(2, 10))

Callable objects Dostęp do wspólnej zmiennej wątków Przypomnienie total distance = 0 class runner(threading.thread):... total distance = total distance + 1 print total distance

Zagadka Callable objects Jaka jest wartość zmiennej total distance?

Zagadka Callable objects Jaka jest wartość zmiennej total distance? Teoria 2 * 42195 = 84390

Zagadka Callable objects Jaka jest wartość zmiennej total distance? Teoria 2 * 42195 = 84390 Praktyka 54390 74390 83464...

Operacje atomowe? Callable objects i = i + 1 LOADFAST 0 LOAD CONST 1 BINARY ADD STORE FAST 0

Operacje atomowe? Callable objects i = i + 1 LOADFAST 0 LOAD CONST 1 BINARY ADD STORE FAST 0 i = i + 1 LOADFAST 0 LOAD CONST 1 BINARY ADD STORE FAST 0

Blokady Callable objects Klasa Lock lock = Lock() def run(self): global lock... lock.acquire() total distance = total distance + 1 lock.release()

Inne blokady Callable objects RLock Wątek może założyć blokadę dowolną liczbę razy, i tyleż razy musi ją zwolnić. Bardzo spowalnia program. Semaphore Blokadę można założyć ustaloną liczbę razy: sem = Semaphore(3) sem.acquire() sem.acquire() sem.acquire() sem.acquire() # blokada

Czekanie na zasób Callable objects Jeden wątek (barman) nalewa mleko do szklanki, drugi (klient) czeka na napełnienie szklanki do pełna i wypija mleko.

Callable objects Implementacja picia mleka lck = Lock() Nalewanie lck.acquire() for i in range(5): szklanka mleka = szklanka mleka + 1 lck.release() Wypijanie while szklanka mleka!= 5: pass lck.acquire() while szklanka mleka > 0: szklanka mleka = szklanka mleka - 1 lck.release()

Callable objects Implementacja picia mleka lck = Lock() Nalewanie lck.acquire() for i in range(5): szklanka mleka = szklanka mleka + 1 lck.release() Wypijanie while szklanka mleka!= 5: pass lck.acquire() while szklanka mleka > 0: szklanka mleka = szklanka mleka - 1 lck.release()

Callable objects Mechanizm który pozwala na usypianie i budzenie wątków.

Implementacja lck = threading.condition() Konsumpcja lck.acquire() while szklanka mleka!= 5: lck.wait() while szklanka mleka > 0: szklanka mleka = szklanka mleka - 1 lck.release() Nalewanie lck.acquire() for i in range(5): szklanka mleka = szklanka mleka + 1 lck.notify() lck.release()

Callable objects są zmiennymi działającymi jak blokady (aquire(), release()); metoda wait() zwalnia blokadę i usypia bieżący wątek; metoda notify() budzi jeden z uśpionych wątków (na tej zmiennej warunkowej), notifyall() budzi wszystkie uśpione wątki.

Callable objects Wady takiego mechanizmu jest tylko jedna szklanka, można do niej tylko nalewać albo tylko z niej pić; barman nie może nalać więcej szklanek na zapas i iść do domu

Bezpieczne struktury Callable objects Thread-safety Struktura danych jest thread-safe, jeśli może być bezpiecznie używana w środowisku wielowątkowym.

Callable objects Struktury danych do programów wielowątkowych Klasa Queue: Jest to kolejka FIFO, thread safe; Konstruktor: Queue(rozmiar ) pobranie elementu (z usunięciem):.get(); gdy kolejka jest pusta zgłasza wyjątek Empty.get(True): gdy kolejka jest pusta, wątek jest usypiany; umieszczenie elementu:.put(element ), gdy kolejka jest pełna to zgłaszany jest wyjątek Full; umieszczenie elementu:.put(element, True), gdy kolejka jest pełna wątek jest usypiany;.full(),.empty()

Warianty klasy Queue Callable objects LifoQueue PriorityQueue

Wskazówka Callable objects lock.acquire() try: ## jakaś operacja finally: lock.release()

Plan wykładu Callable objects 1 Callable objects 2 3

Efektywnosć watków: GIL

Efektywnosć watków: GIL Źródło: Wikimedia

Callable objects Efektywność standardowych wątków Global Interperter Lock (GIL) Tylko jeden wątek ma dostęp do bytecodu. Operacje I/O GIL jest zwalniany podczas czekania na operacje We/Wy.

Callable objects Biblioteka multiprocessing podobna do threading; oparta o procesy, nie o wątki; więc nie powinno być problemu z GIL em.

Callable objects Tworzenie procesów import multiprocesing p = multiprocessing.process(target=callable, args=sequence)

Callable objects Tworzenie procesów import multiprocesing p = multiprocessing.process(target=callable, args=sequence) Mi nie zadziałało w Pythonie 3.1.2 :-(

Callable objects Tworzenie procesów import multiprocesing p = multiprocessing.process(target=callable, args=sequence) Mi nie zadziałało w Pythonie 3.1.2 :-( Ale zadziałało w 3.2.3 :-)

Process Callable objects pr = Process(target=foo, args=(1,2,3)) pr.start() pr.join()

Callable objects Co mi też zadziałało Pule wątków Biblioteka Pool

Callable objects Co mi też zadziałało Pule wątków Biblioteka Pool Liczby Fibonacciego Algorytm rekurencyjny, pierwsze wywołanie dzieli na dwa procesy.

Callable objects Implementacja wieloprocesorowa def fib(n): if n < 2: return 1 return fib(n - 1) + fib(n - 2) from multiprocessing import Pool def pfib(n): if n < 2: return 1 p = Pool(2) result = p.map(fib, [n-1, n-2]) return sum(result)

Callable objects Wymiana informacji między procesami multiprocessing.value val = Value( i, 0)... val.value = 512

Callable objects Wymiana informacji między procesami multiprocessing.value val = Value( i, 0)... val.value = 512 multiprocessing.queue q = Queue()... q.put(wartosc) q.get()

Callable objects Komunikacja synchroniczna par conn, child conn = Pipe()... child conn.send([1, dwa, 3.0])... print(par conn.recv())

Callable objects I jeszcze jedna biblioteka concurrent.futures automatyczny wybór między wątkami a procesami; Od wersji 3.2