Programowanie w Ruby

Podobne dokumenty
Zaawansowany kurs języka Python

Programowanie obiektowe

Programowanie w Ruby

Kurs języka Python. Wątki

Kurs rozszerzony języka Python

Testowanie aplikacji. Kurs języka Ruby

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

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

Programowanie w Ruby


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

Programowanie w Ruby

Wykład 5 Wybrane zagadnienia programowania w C++ (c.d.)

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

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

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

Programowanie w Ruby

Programowanie w Ruby

Zadanie polega na stworzeniu bazy danych w pamięci zapewniającej efektywny dostęp do danych baza osób.

Programowanie wielowątkowe. Jarosław Kuchta

Monitory. Jarosław Kuchta

Systemy operacyjne. Zajęcia 11. Monitory

Programowanie w Ruby

Programowanie w Ruby

Programowanie w Ruby

Programowanie w Ruby

Programowanie w Ruby

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

Diagramy klas. dr Jarosław Skaruz

Programowanie w Ruby

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

Programowanie w Ruby

Struktury danych (I): kolejka, stos itp.

Programowanie w Ruby

Programowanie obiektowe

Zaawansowane programowanie w C++ (PCP)

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

Zaawansowane programowanie w języku C++

Programowanie obiektowe

Narzędzia informatyczne w językoznawstwie

Wstęp do programowania 2

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

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

Programowanie obiektowe

Kurs rozszerzony języka Python

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

Programowanie Równoległe i Rozproszone

Programowanie obiektowe

Metaprogramowanie w Ruby

Wstęp do informatyki. Maszyna RAM. Schemat logiczny komputera. Maszyna RAM. RAM: szczegóły. Realizacja algorytmu przez komputer

Programowanie obiektowe

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

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

synchronizacji procesów

Programowanie w Ruby

Programowanie obiektowe

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

Programowanie obiektowe

PHP: bloki kodu, tablice, obiekty i formularze

Podstawy programowania obiektowego

Programowanie współbieżne Wykład 2. Iwona Kochańska

Kurs rozszerzony języka Python

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 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ę.

Język Java wątki (streszczenie)

Programowanie obiektowe

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

Marcin Luckner Politechnika Warszawska Wydział Matematyki i Nauk Informacyjnych

Programowanie i projektowanie obiektowe

synchronizacji procesów

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

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

Wprowadzenie do programowania współbieżnego

Referencje do zmiennych i obiektów

Programowanie w Ruby

Język PL/SQL Procedury i funkcje składowane

Klasy abstrakcyjne, interfejsy i polimorfizm

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

Podstawy programowania 2. Przygotował: mgr inż. Tomasz Michno

Podstawy programowania. Wykład PASCAL. Wstęp do programowania obiektowego. dr Artur Bartoszewski - Podstawy programowania, sem.

Smarty PHP. Leksykon kieszonkowy

Wstęp do programowania

Kurs WWW. Paweł Rajba.

Lista, Stos, Kolejka, Tablica Asocjacyjna

Model pamięci. Rafał Skinderowicz

Automatyzacja testowania oprogramowania. Automatyzacja testowania oprogramowania 1/36

TorqueBox. Moc Javy piękno Rubiego

Grafem nazywamy strukturę G = (V, E): V zbiór węzłów lub wierzchołków, Grafy dzielimy na grafy skierowane i nieskierowane:

Redis, skrypty w języku Lua

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

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Scenariusz lekcji. wymienić podstawowe dynamiczne struktury danych (stos, kolejka, lista, graf, drzewo); opisać sposób dostępu do danych w kolejce;

Wykład 4. Klasa List Kolejki Stosy Słowniki

Oracle PL/SQL. Paweł Rajba.

INFORMATYKA W SZKOLE. Podyplomowe Studia Pedagogiczne. Dr inż. Grażyna KRUPIŃSKA. D-10 pokój 227

Delphi Laboratorium 3

Podstawy programowania

PODSTAWY BAZ DANYCH 13. PL/SQL

DYNAMICZNE PRZYDZIELANIE PAMIECI

Dzisiejszy wykład. Programowanie w Perlu. Usuwanie elementów z początku tablicy. Dodawanie elementów do początku tablic

Transkrypt:

Programowanie w Ruby Wykład 8 Marcin Młotkowski 3 grudnia 2018

Plan wykładu 1 2 Marcin Młotkowski Programowanie w Ruby 224 / 435

Wątki wyzwania Tworzenie wątków Dostęp do wspólnych zasobów Przekazywanie wartości Marcin Młotkowski Programowanie w Ruby 225 / 435

Program jednowątkowy Przykład for url in %w{ftp.com www.org http.net} ściągnij url end Marcin Młotkowski Programowanie w Ruby 226 / 435

To samo, ale wielowątkowo require net/http threads = [ ] for page in page list threads << Thread.new(page) do url h = Net::HTTP.new(url, 80) resp = h.get( /, nil ) end end threads.each { t t.join } Marcin Młotkowski Programowanie w Ruby 227 / 435

Dostęp do wspólnych zasobów Chcemy zorganizować wyścigi wątków Marcin Młotkowski Programowanie w Ruby 228 / 435

Implementacja threads = [ ] 5.times do num threads << Thread.new(num) do n dystans = 42196 dystans -= 1 while dystans > 0 puts #{n} Meta!!! end end threads.each { t t.join() } Marcin Młotkowski Programowanie w Ruby 229 / 435

A ile przebiegli wszyscy razem? total = 0 Mała modyfikacja while dystans > 0 total += 1 dystans -= 1 end Marcin Młotkowski Programowanie w Ruby 230 / 435

Próbujemy! Próba 1. 180634 Marcin Młotkowski Programowanie w Ruby 231 / 435

Próbujemy! Próba 1. 180634 Próba 2. 161237 Marcin Młotkowski Programowanie w Ruby 231 / 435

Próbujemy! Próba 1. 180634 Próba 2. 161237 Próba 3. 159984 Marcin Młotkowski Programowanie w Ruby 231 / 435

Próbujemy! Próba 1. 180634 Próba 2. 161237 Próba 3. 159984 Powinno być 5 42196 = 210980 Marcin Młotkowski Programowanie w Ruby 231 / 435

Próbujemy! Próba 1. 180634 Próba 2. 161237 Próba 3. 159984 Powinno być 5 42196 = 210980 Marcin Młotkowski Programowanie w Ruby 231 / 435

Dlaczego Implementacja total += 1 val = fetch current(@total) add 1 to val store val back into @total Marcin Młotkowski Programowanie w Ruby 232 / 435

Przebieg, 1. scenariusz val = fetch current(@total) add 1 to val store val back into @total val = fetch current(@total) add 1 to val store val back into @total Marcin Młotkowski Programowanie w Ruby 233 / 435

Przebieg, 2 scenariusz # total = 2 # total = 2 val = fetch current(@total) val = fetch current(@total) add 1 to val # val = 3 add 1 to val # val = 3 store val back into @total store val back into @total # total = 3 # total = 3 Marcin Młotkowski Programowanie w Ruby 234 / 435

Dostęp do zasobów wspólnych Monitory require monitor lock = Monitor.new lock.synchronize { total += 1 } Marcin Młotkowski Programowanie w Ruby 235 / 435

Dostęp do zasobów wspólnych Monitory require monitor lock = Monitor.new lock.synchronize { total += 1 } Wady Wolne Marcin Młotkowski Programowanie w Ruby 235 / 435

Dostęp do zmiennych wątka Wątki można traktować jak tablice asocjacyjne Marcin Młotkowski Programowanie w Ruby 236 / 435

Dostęp do zmiennych wątka Wątki można traktować jak tablice asocjacyjne th = Thread.new do Thread.current[ zmienna ] = 1024 end puts th[ zmienna ] Marcin Młotkowski Programowanie w Ruby 236 / 435

Wielowątkowe systemy asynchroniczne Są dwa wątki, które wymieniają dane między sobą. Marcin Młotkowski Programowanie w Ruby 237 / 435

Pierwsze podejście $BUFOR # zmienna globalna PRODUCENT while true while $BUFOR; end $BUFOR = dane end KONSUMENT while true while not $BUFOR; end Thread.new { foo($bufor) } $BUFOR = nil end Marcin Młotkowski Programowanie w Ruby 238 / 435

Wady Wątki działają synchronicznie; prościej można to zaprogramować tak: foo(dane) Marcin Młotkowski Programowanie w Ruby 239 / 435

Wady Wątki działają synchronicznie; prościej można to zaprogramować tak: foo(dane) Dużo pochłania aktywne czekanie: while warunek; end Marcin Młotkowski Programowanie w Ruby 239 / 435

Schemat dobrego rozwiązania Wątki można usypiać (Thread#stop) i budzić (Thread.run) Można uśpić KONSUMENTA i obudzić gdy będą dane do przetwarzania Dane do przetworzenia są przechowywane w kolejce Marcin Młotkowski Programowanie w Ruby 240 / 435

Kolejka Queue (SizedQueue) require thread qu = Queue.new # SizedQueue(1024) enq(obj) wkłada do kolejki obiekt. Jeśli kolejka jest pełna (w przypadku SizedQueue) wątek wkładający do kolejki jest usypiany deq pobranie elementu z kolejki; jeśli kolejka jest pusta wątek który wywołuje tę metodę jest usypiany Marcin Młotkowski Programowanie w Ruby 241 / 435

Implementacja Producent loop do dane = gets.chomp qu.enq (dane) end Marcin Młotkowski Programowanie w Ruby 242 / 435

Implementacja Producent loop do dane = gets.chomp qu.enq (dane) end Konsument loop do obj = qu.deq Thread.new(arg) { arg foo(arg) } end Marcin Młotkowski Programowanie w Ruby 242 / 435

Plan wykładu 1 2 Marcin Młotkowski Programowanie w Ruby 243 / 435

Testy jednostkowe Program testujący pojedynczy fragment kodu (funkcję czy metodę) Podczas testowania sprawdzane są asercje Testy można łączyć w pakiety Marcin Młotkowski Programowanie w Ruby 244 / 435

Testowanie w Rubym Narzędzia są w module test/unit Testy umieszcza się w metodach klasy będącej podklasą Test::Unit::TestCase Marcin Młotkowski Programowanie w Ruby 245 / 435

Testowanie implementacji Stos Klasa implementuje stos o ograniczonym rozmiarze rozmiar stosu jest ustalany w konstruktorze enq(obj) wkłada obiekt na stos; jeżeli stos jest pełny zgłaszany jest wyjątek StackOverflow deq zdejmuje element ze stosu; jeśli stos jest pusty zgłaszany jest wyjątek EmptyStack Marcin Młotkowski Programowanie w Ruby 246 / 435

Implementacja testów require test/unit require Stack class TestStack < Test::Unit::TestCase Marcin Młotkowski Programowanie w Ruby 247 / 435

Testowanie poprawnej kolejności def test list q = MyStack.new(3) 0.upto(2) { i q.enq(i) } 2.downto(0) { i assert equal(i, q.deq) } end Marcin Młotkowski Programowanie w Ruby 248 / 435

Testowanie wyjątków def test extreme q = MyStack.new(2) assert raise(emptystack) { q.deq } 2.times { n q.enq(n) } assert raise(stackoverflow) { q.enq(234) } end Marcin Młotkowski Programowanie w Ruby 249 / 435

Różne testy def test random assert nothing raised() { MyStack.new(0) } assert nothing raised() { MyStack.new(-10) } end Marcin Młotkowski Programowanie w Ruby 250 / 435

Wynik Loaded suite test_qu Started... Finished in 0.001094 seconds. 3 tests, 7 assertions, 0 failures, 0 errors Marcin Młotkowski Programowanie w Ruby 251 / 435