Pobieranie prezentacji. Proszę czekać

Pobieranie prezentacji. Proszę czekać

Python multiprocessing Joanna Wiśniewska Michał Witkowski.

Podobne prezentacje


Prezentacja na temat: "Python multiprocessing Joanna Wiśniewska Michał Witkowski."— Zapis prezentacji:

1 Python multiprocessing Joanna Wiśniewska Michał Witkowski

2 Filtrowanie listy * przy wykorzystaniu pętli for * przy wykorzystaniu funkcji filter * przy wykorzystaniu wyrażeń listowych >>> [item for item in li if odd(item)] [1, 3, 5, 9, -3] >>> filter(odd, li) [1, 3, 5, 9, -3] >>> li = [1, 2, 3, 5, 9, 10, 256, -3] >>> def odd(n): return n % 2 >>> filteredList = [] >>> for n in li: if odd(n): filteredList.append(n) >>> filteredList [1, 3, 5, 9, -3]

3 Funkcja Filter filter(function, iterable) ● Dane wejściowe: ● Funkcja – musi przyjmować jeden argument ● Obiekt po której elementach będziemy iterować, np. lista ● Dane wynikowe: ● Lista – złożona z elementów listy wejściowej, dla których funkcja zwróciła wartość true ● Jeżeli nie użyjemy żadnej funkcji (None) to zostanie zwrócona lista złożona z elementów obiektu wejściowego

4 Odwzorowywanie listy * przy wykorzystaniu pętli for * przy wykorzystaniu funkcji map * wykorzystując wyrażenia listowe >>> [double(n) for n in li] [2, 4, 6, 10, 18, 20, 512, -6] >>> map(double, li) [2, 4, 6, 10, 18, 20, 512, -6] >>> li = [1, 2, 5, 9, 10, 256, -3] >>> def double(n): return n * 2 >>> newlist = [] >>> for n in li: newlist.append(double(n)) >>> newlist [2, 4, 10, 18, 20, 512, -6]

5 Funkcja Map map(function, iterable, …) ● Dane wejściowe ● Funkcja – może przyjmować wiele argumentów ● Obiekt po której elementach będziemy iterować, np. lista ● Dane wynikowe ● Lista – złożona z elementów listy wejściowej zmodyfikowanych zgodnie z funkcją wejściową ● Jeżeli nie użyjemy żadnej funkcji (None) to zostanie zwrócona lista złożona z elementów obiektu wejściowego

6 Iteratory ● Są jednym z podstawowych elementów Pythona, często niezauważalne ● Wykorzystywane między innymi w pętlach: ● ● Udostępniane przez wszystkie standardowe typy sekwencyjne oraz wiele wbudowanych klas ● iter() - wykorzystywana do pobrania iteratora z kolekcji typu sekwencyjnego ● next() - zwraca kolejny element kolekcji, jeżeli nie ma już kolejnego elementu wywoływana zostaje metoda StopIteration >>> for value in sequence: print value

7 Tworzenie iteratorów W języku Python możliwe jest definiowanie własnych klas - kontenerów, po których elementach można iterować. Konieczna jest jednak implementacja metody ● container.__iter__() - która zwraca obiekt iteratora Obiekt iteratora powinien obsługiwać następujące metody: ● iterator.__iter__() - która zwraca dany iterator ● iterator.next() - kolejny element z kontenera, jeżeli nie ma już kolejnego elementu wywoływana zostaje metoda StopIteration, która przerywa działanie

8 Ciąg Fibonacciego class Fib: def __init__(self, max): self.max = max def __iter__(self): self.a = 0 self.b = 1 return self def __next__(self): fib = self.a if fib > self.max: raise StopIteration self.a, self.b = self.b, self.a + self.b return fib

9 Przykład wywołania * iterowanie po elementach w pętli * przypisanie elementów do listy >>> from fibonacci2 import fib >>> for n in fib(1000): Print n, >>> list(fib(1000)) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987]

10 Zalety stosowania iteratorów ● dobra abstrakcja nad kolekcją ● umożliwiają nakładanie dodatkowych ograniczeń na dostęp ● dostarczają jednorodny sposób iterowania po różnych strukturach danych ● zezwalają na modyfikację przeglądanych elementów kolekcji bez zaburzenia iteracji ● otrzymywane dane wynikowe zwiększają się po każdej iteracji, nie jest konieczna wcześniejsza rezerwacja miejsca

11 Funkcja iFilter ● Argumenty wejściowe: pred, seq ● Dane wyjściowe: kolejne elementy wynikowe funkcji pred(elem) dla których funkcja zwróciła wartość true ifilter(lambda x: x%2, range(10)) --> def ifilter(predicate, iterable): if predicate is None: predicate = bool for x in iterable: if predicate(x): yield x

12 Funkcja iMap ● Argumenty wejściowe: func, p, q,.. ● Dane wyjściowe: Kolejne elementy wynikowe zmodyfikowane zgodnie z funkcją wejściową (p0, q0), func(p1, q1),... imap(pow, (2,3,10), (5,2,3)) --> def imap(function, *iterables): iterables = map(iter, iterables) while True: args = [next(it) for it in iterables] if function is None: yield tuple(args) else: yield function(*args)

13 Wątki w Pythonie ● thread – interfejs niskopoziomowy ● Bezpośrednio udostępnia funkcje systemu operacyjnego ● threading – interfejs wysokopoziomowy ● Lock, Rlock – zamek zwykły i zamek reentrant ● Semaphore – semafor ● Condition – zmienne warunkowe ● Event – powiadomienia międzyprocesowe ● Queue – synchoniczna kolejka – „best thing since sliced bread”

14 Global Interpreter Lock ● Zapewnia, że tylko jeden wątek jest wykonywany w CPython Virtual Machine ● Chroni m.in.: ● Liczniki referencji (garbage collection) ● Dostęp do funkcji w C – nawet tych obudowanych ● Dostęp do funkcji systemowych ● Jest wolny na wielordzeniowych systemach ale szybki w sekwencyjnym przetwarzaniu ● Tak, próbowano się go pozbyć...

15 5000 liczb ciągu Fibonacciego Źródło: PEP 371

16 Jeśli nie wątki to może procesy?

17 Moduł multiprocessing ● Przetwarzanie pomiędzy procesami przestaje boleć: ● Process – abstrakcja dla procesu ● Pipe – jeden-do-jeden z automatycznym piklowaniem ● Queue – synchronizowana kolejka wiele-do-wiele – oczywiście z automatycznym piklowaniem ● Array, Value – segment pamięci współdzielonej ● Lock, Rlock, Condition, Event, Semaphore

18 Przykład Queue from multiprocessing import Process, Queue def f(q): q.put([42, None, 'hello']) if __name__ == '__main__': q = Queue() p = Process(target=f, args=(q,)) p.start() print q.get() # prints "[42, None, 'hello']" p.join()

19 Mechanizm manager ● Wyróżniony proces zdalny ● BaseManager – przechowujący współdzielone dane – metoda register – zmienne dostępne jako atrybuty managera ● SyncManager – zarządzający synchronizacją (Lock, Rlock, Condition, Event, Semaphore) ● Wolniejszy od bezpośredniego współdzielenia, ale: ● Może być lokalny lub zdalny (adres IP, port) ● Pozwala na własne modyfikacje poprzez dziedziczenie ● Zmienne w innych procesach (Client) są udostępniane poprzez mechanizm Proxy

20 multiprocessing vs threading wget python bench.pyhttp://sirius/~inf80163/mbp/bench.py ● Jak wygląda wydajność mechanizmów synchronizacji? ● Który jest szybszy?

21 Mechanizm Pool ● Pula procesów na której wykonujemy pewne operacje ● Wykorzystuje Queue do realiacji metod m.in..: ● map – wieloprocesowa mapa – blokuje do wyników ● map_async - mapa z callbackiem do wyników ● imap – iterator mapy przetwarzania wieloprocesowego ● apply_async - wieloprocesorowe wykonanie funkcji dla każdego elementu zadanego argumentu z osobna

22 Przykład Pool from multiprocessing import Pool def f(x): return x*x if __name__ == '__main__': pool = Pool(processes=4) result = pool.apply_async(f, (10,)) print result.get(timeout=1) # prints "100" print pool.map(f, range(10)) # prints "[0, 1, 4,..., 81]" it = pool.imap(f, range(10)) print it.next() # prints "0" print it.next() # prints "1" print it.next(timeout=1) # prints "4"

23 Problem plecakowy wget vim knapsack.py ● Porównać wydajność wersji sekwencyjnej z: ● wątkami – multiprocessing.pool.ThreadPool ● procesami - multiprocessing.pool.Pool ● Który jest szybszy? Jaką metodę użyć? ● Help może się przydać, google: python multiprocessing

24 Pakiet concurrent.futures ● Jeszcze łatwiejsze wieloprocesowe/wielowątkowe przetwarzanie ● PEP 3148 – świeża propozycja z 2009 roku ● Dostępny jako pakiet futures (easy_install futures) ● Włączony do Python 3.2 (wersja beta) ● 2 proste operacje: ● map – wieloprocesowa mapa – zwraca iterator ● submit – asynchroniczne wykonanie funkcji ● Dostępne (póki co) dwie implementacje: ● ThreadPoolExecutor ● ProcessPoolExecutor

25 Przykład submit from concurrent.futures import ThreadPoolExecutor import shutil with ThreadPoolExecutor(max_workers=4) as e: e.submit(shutil.copy, 'src1.txt', 'dest1.txt') e.submit(shutil.copy, 'src2.txt', 'dest2.txt') e.submit(shutil.copy, 'src3.txt', 'dest3.txt') e.submit(shutil.copy, 'src3.txt', 'dest4.txt')

26 Przykład map import concurrent.futures import math PRIMES = [ , , , , , ] def is_prime(n): if n % 2 == 0: return False sqrt_n = int(math.floor(math.sqrt(n))) for i in range(3, sqrt_n + 1, 2): if n % i == 0: return False return True with concurrent.futures.ProcessPoolExecutor() as executor: for number, prime in zip(PRIMES, executor.map(is_prime, PRIMES)): print('%d is prime: %s' % (number, prime))

27 Koniec


Pobierz ppt "Python multiprocessing Joanna Wiśniewska Michał Witkowski."

Podobne prezentacje


Reklamy Google