Kurs rozszerzony języka Python

Podobne dokumenty
Zaawansowany kurs 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

Kurs programowania. Wykład 8. Wojciech Macyna

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

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

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

Język Java wątki (streszczenie)

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

Bezbolesne Programowanie Współbieżne

Zaawansowany kurs języka Python

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

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

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

Kurs rozszerzony języka Python

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

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

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

Zaawansowane programowanie w C++ (PCP)

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

Wątki w Javie. Piotr Tokarski

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

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

Podstawy współbieżności

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

Programowanie obiektowe

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

Język Java wątki (streszczenie)

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

Wstęp do programowania

Współbieżność w Javie

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

Współbieżność w Javie

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

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

Programowanie i projektowanie obiektowe

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

Task Parallel Library

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

Wstęp do programowania

Programowanie komputerów

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

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


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

Zaawansowany kurs języka Python

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

Wstęp do programowania

Programowanie i projektowanie obiektowe

Programowanie współbieżne i rozproszone

System operacyjny MACH

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

Szablony funkcji i szablony klas

Programowanie obiektowe

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

Programowanie wielowątkowe. Tomasz Borzyszkowski

Programowanie obiektowe

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

Systemy operacyjne. Zajęcia 11. Monitory

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

Wzorce logiki dziedziny

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)

Sphinx - system dokumentacji dla Pythona

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

Wstęp do programowania

Kurs rozszerzony języka Python

Wykresy i interfejsy użytkownika

Programowanie obiektowe

Kurs rozszerzony języka Python

Zaawansowany kurs języka Python

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Java. Programowanie Obiektowe Mateusz Cicheński

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

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

Wywoływanie metod zdalnych

Wprowadzenie do szablonów szablony funkcji

Wprowadzenie do szablonów szablony funkcji

Metaprogramowanie w Ruby

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

Wprowadzenie do programowania

Programowanie i projektowanie obiektowe

Programowanie i projektowanie obiektowe

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie

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

Hackowanie zamrożonych binariów

FUNKCJA REKURENCYJNA. function s(n:integer):integer; begin if (n>1) then s:=n*s(n-1); else s:=1; end;

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

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Transkrypt:

Wykład 6. 10 listopada 2017

Plan wykładu 1 2 3

Plan wykładu 1 2 3

Wszystko jest obiektem.

Wszystko jest obiektem. A funkcje?

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

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

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

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.

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 Potrzebuję licznika licznik() # zwraca 1 licznik() # zwraca 2 licznik() # zwraca 3

Własny licznik 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 1 2 3

Wstęp 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 zrównoleglenie wolnych operacji wejścia/wyjścia (ściąganie pliku/obsługa interfejsu) jednoczesna obsługa wielu operacji, np. serwery WWW

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

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

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 moduł threading class Thread: def run(self): Operacje wykonywane w wątku def start(self): Wystartowanie obliczeń w wątku

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

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 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 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 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 Podsumowanie tworzymy dziedzicząc po klasie Thread.

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

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))

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 Jaka jest wartość zmiennej total distance?

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

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

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

Operacje atomowe? 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 Klasa Lock lock = Lock() def run(self): global lock... lock.acquire() total distance = total distance + 1 lock.release()

Inne blokady 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 Jeden wątek (barman) nalewa mleko do szklanki, drugi (klient) czeka na napełnienie szklanki do pełna i wypija mleko.

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()

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()

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()

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.

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 Thread-safety Struktura danych jest thread-safe, jeśli może być bezpiecznie używana w środowisku wielowątkowym.

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 LifoQueue PriorityQueue

Bar mleczny: inne rozwiązanie def mlekopij(q): while True: szklanka mleka = q.get() q.task done() q = queue.queue() m = threading.thread(target=mlekopij, args=(q)) m.start() for mleczko in bar mleczny: q.put(mleczko) q.join() m.join()

Plan wykładu 1 2 3

Efektywnosć watków: GIL

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

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.

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

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

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

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 pr = Process(target=foo, args=(1,2,3)) pr.start() pr.join()

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

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

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)

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

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

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

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