Differences

This shows you the differences between two versions of the page.

Link to this comparison view

asc:laboratoare:03 [2023/02/21 15:23]
giorgiana.vlasceanu [Resurse]
asc:laboratoare:03 [2023/03/17 01:00] (current)
emil.slusanschi [Exerciții]
Line 153: Line 153:
 De multe ori este necesar ca un grup de thread-uri să ajungă toate într-un anumit punct al execuției (ex: fiecare thread a calculat un rezultat intermediar al algoritmului) și numai după aceea să își continue execuția (ex: rezultatele intermediare sunt partajate de toate thread-urile în partea următoare a algoritmului). Mecanismul de sincronizare potrivit pentru asemenea situații este **bariera**. De multe ori este necesar ca un grup de thread-uri să ajungă toate într-un anumit punct al execuției (ex: fiecare thread a calculat un rezultat intermediar al algoritmului) și numai după aceea să își continue execuția (ex: rezultatele intermediare sunt partajate de toate thread-urile în partea următoare a algoritmului). Mecanismul de sincronizare potrivit pentru asemenea situații este **bariera**.
  
-Începând cu Python 3.2 în modulul //​threading//​ a fost introdusă clasa //​[[https://​docs.python.org/​3/​library/​threading.html#​barrier-objects|Barrier]]//,​ acesta fiind o barieră reentrantă implementată folosind variabile condiție ([[https://​github.com/​python/​cpython/​blob/​master/​Lib/​threading.py#​L580|cod sursă]]). În această secțiune vom prezenta două variante pentru implementarea unui astfel de obiect.+Începând cu Python 3.2 în modulul //​threading//​ a fost introdusă clasa //​[[https://​docs.python.org/​3/​library/​threading.html#​barrier-objects|Barrier]]//,​ acesta fiind o barieră reentrantă implementată folosind variabile condiție ([[https://​github.com/​python/​cpython/​blob/​bb396eece44036a71427e7766fbb8e0247373102/​Lib/​threading.py#​L649|cod sursă]]). În această secțiune vom prezenta două variante pentru implementarea unui astfel de obiect.
  
 Ce trebuie să ofere o barieră? Ce trebuie să ofere o barieră?
Line 304: Line 304:
 </​code>​ </​code>​
  
-Puteți găsi aici modul de implementare a [[https://​github.com/​python/​cpython/​blob/​master/​Lib/​threading.py#​L580|barierei cu condition]] din sursele oficiale.+Puteți găsi aici modul de implementare a [[https://​github.com/​python/​cpython/​blob/​bb396eece44036a71427e7766fbb8e0247373102/​Lib/​threading.py#​L649|barierei cu condition]] din sursele oficiale.
  
  ===== Exerciții =====   ===== Exerciții ===== 
Line 313: Line 313:
 **Task 1** Condition ​ **Task 1** Condition ​
   ​   ​
- ​Pornind de la fișierul ''​task1.py'',​ înlocuiți obiectele //Event// ''​work_available''​ și ''​result_available''​ cu o singură variabilă condiție, păstrand funcționalitatea programului intactă. ​+ ​Pornind de la fișierul ''​event.py'',​ înlocuiți obiectele //Event// ''​work_available''​ și ''​result_available''​ cu o singură variabilă condiție, păstrand funcționalitatea programului intactă. ​
   ​   ​
 **Task 2** Events ​ **Task 2** Events ​
   ​   ​
- ​Rulați fișierul ''​task2.py''​. Încercați diferite valori pentru //​sleep()//​-ul de la linia 47. Încercați eliminarea apelului //​sleep()//​. Ce observați? Precizați secvența _minimă_ de intercalare a apelurilor ''​set''​ și ''​wait''​ pe cele două obiecte //Event// care generează comportamentul observat. ​+ ​Rulați fișierul ''​broken_event.py''​. Încercați diferite valori pentru //​sleep()//​-ul de la linia 48. Încercați eliminarea apelului //​sleep()//​. Ce observați? Precizați secvența _minimă_ de intercalare a apelurilor ''​set''​ și ''​wait''​ pe cele două obiecte //Event// care generează comportamentul observat. ​
      * Folosiți ''​Ctrl+\''​ pentru a opri un program blocat. ​      * Folosiți ''​Ctrl+\''​ pentru a opri un program blocat. ​
      * Folosiți //sleep()// pentru a forța diferite intercalări ale thread-urilor. ​      * Folosiți //sleep()// pentru a forța diferite intercalări ale thread-urilor. ​
Line 323: Line 323:
      * :!: Datorită intercalărilor thread-urilor este posibil ca //​print//​-urile să nu reflecte ordinea exactă a operațiilor. Rulați de mai multe ori pentru a putea prinde problema. ​      * :!: Datorită intercalărilor thread-urilor este posibil ca //​print//​-urile să nu reflecte ordinea exactă a operațiilor. Rulați de mai multe ori pentru a putea prinde problema. ​
   ​   ​
-**Task 3** ThreadPoolExecutor - Completați fișierul ''​task3.py''​.+**Task 3** ThreadPoolExecutor - Completați fișierul ''​dna.py''​.
   ​   ​
  ​Folosind un pool de thread-uri căutați o secvență de ADN într-un set de eșantioane de ADN (DNA samples). Creați-vă un modul în care:   ​Folosind un pool de thread-uri căutați o secvență de ADN într-un set de eșantioane de ADN (DNA samples). Creați-vă un modul în care: 
Line 338: Line 338:
   -Folosind [[https://​docs.python.org/​3/​library/​concurrent.futures.html#​concurrent.futures.Executor.submit|submit]] sau [[https://​docs.python.org/​3/​library/​concurrent.futures.html#​concurrent.futures.Executor.map|map]] dați spre execuție funcția de căutare.  ​   -Folosind [[https://​docs.python.org/​3/​library/​concurrent.futures.html#​concurrent.futures.Executor.submit|submit]] sau [[https://​docs.python.org/​3/​library/​concurrent.futures.html#​concurrent.futures.Executor.map|map]] dați spre execuție funcția de căutare.  ​
   -Afișați rezultatele ​   -Afișați rezultatele ​
-      * păstrați ce întorc apelurile către submit sau rezultatul lui map într-o variabilă și apoi iterați pe elementele din ea, afișând fiecare rezultat+      * păstrați ce întorc apelurile către submit sau rezultatul lui map într-o variabilă și apoi iterați pe elementele din ea, afișând fiecare rezultat ​
       * puteți vedea în [[asc:​laboratoare:​03#​threadpoolexecutor|exemplul din laborator]] cum se afișează rezultatele unui map, sau în documentație pentru [[https://​docs.python.org/​3/​library/​concurrent.futures.html#​threadpoolexecutor-example|submit]] ​       * puteți vedea în [[asc:​laboratoare:​03#​threadpoolexecutor|exemplul din laborator]] cum se afișează rezultatele unui map, sau în documentație pentru [[https://​docs.python.org/​3/​library/​concurrent.futures.html#​threadpoolexecutor-example|submit]] ​
           * dacă nu sunteți familiari cu sintaxa de one-liners folosită în documentație,​ puteți folosi simple for-uri, va creați o lista goală înainte, și la fiecare iterație din for adăugați în ea rezultatul metodei submit. După aceea mai faceți un for în care afișați elementele din lista, apelând .result() pe fiecare din ele.            * dacă nu sunteți familiari cu sintaxa de one-liners folosită în documentație,​ puteți folosi simple for-uri, va creați o lista goală înainte, și la fiecare iterație din for adăugați în ea rezultatul metodei submit. După aceea mai faceți un for în care afișați elementele din lista, apelând .result() pe fiecare din ele. 
Line 351: Line 351:
  
   * <​html><​a class="​media mediafile mf_pdf"​ href=":​asc:​lab3:​index?​do=export_pdf">​PDF laborator</​a></​html>​   * <​html><​a class="​media mediafile mf_pdf"​ href=":​asc:​lab3:​index?​do=export_pdf">​PDF laborator</​a></​html>​
-  * {{:asc:lab3:lab3-skel.zip|Schelet laborator}}+  * {{:asc:laboratoare:lab3-skel_2023.zip|Schelet laborator}}
   <​hidden> ​ * {{:​asc:​lab3:​lab3-sol.zip|Soluție laborator}} ​ </​hidden>​   <​hidden> ​ * {{:​asc:​lab3:​lab3-sol.zip|Soluție laborator}} ​ </​hidden>​
  
asc/laboratoare/03.1676985830.txt.gz · Last modified: 2023/02/21 15:23 by giorgiana.vlasceanu
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0