Programmazione multi threaded in Python. Linguaggi dinamici A.A. 2010/2011 1

Documenti analoghi
Multithreading in Java. Fondamenti di Sistemi Informativi

Modelli di programmazione parallela

Lab 1: Java Multithreading

Corso di Laboratorio di Sistemi Operativi

Programmazione concorrente con il linguaggio Java

Modelli di interazione tra processi

Gestione dei thread in Java LSO 2008

19. Introduzione al multi-threading

T 1. Per un processo con più thread di controllo, lo stato di avanzamento della computazione di ogni thread è dato da:

Programmazione Orientata agli Oggetti. Emilio Di Giacomo e Walter Didimo

Java threads (2) Programmazione Concorrente

Modelli di interazione tra processi

Java Virtual Machine

Modelli di interazione tra processi

IL LINGUAGGIO JAVA Input, Tipi Elementari e Istruzione Condizionale

Java Native Interface Appunti

Programmazione. Cognome... Nome... Matricola... Prova scritta del 11 luglio 2014

I THREAD O PROCESSI LEGGERI

GESTIONE DEI PROCESSI

Linguaggi Corso M-Z - Laurea in Ingegneria Informatica A.A lezione 14 - Thread in Java

Con il pulsante Start si introducono palline che rimbalzano in un area di disegno fino a che non è terminato il loro ciclo di vita (1000 movimenti).

7 - Programmazione procedurale: Dichiarazione e chiamata di metodi ausiliari

SISTEMI OPERATIVI. Nucleo di un SO. Il Nucleo. Il nucleo di un SO Gestione delle interruzioni Sincronizzazione tra processi Dispatcher. 06.

Fondamenti di Informatica T-1 Modulo 2

Definizione di metodi in Java

T E O R I A D I P R O G E T T A Z I O N E D E L S O F T W A R E

Uso di metodi statici. Walter Didimo

Ottava Esercitazione. introduzione ai thread java mutua esclusione

Analizzatori Lessicali con JLex. Giuseppe Morelli

Programmazione Concorrente in Java

Multithreading in Java

Programmazione. Cognome... Nome... Matricola... Prova scritta del 22 settembre Negli esercizi proposti si utilizzano le seguenti classi:

Esercitazioni 7 e 8. Bounded Buffer con sincronizzazione Java (1)

Esercizio sui Semafori

Un esercizio d esame. Flavio De Paoli

INDICE. Vista Libretto Livello Digitale 2. Importazione di dati da strumento 3. Inserisci File Vari 5. Compensazione Quote 5.

Sincronizzazione. Soluzioni hardware Stefano Quer Dipartimento di Automatica e Informatica Politecnico di Torino

SISTEMI OPERATIVI. Sincronizzazione in Java (Semafori e barriere) Patrizia Scandurra (MODULO DI INFORMATICA II) LABORATORIO

Esercitazione 15. Il problema dello Sleeping Barber

Fondamenti di Informatica T-1. Costruttori Ereditarietà

Laboratorio di Programmazione 1 [Java]

PG5 Starter Training Applicazione File System Daniel Ernst EN Stefano Peracchi IT

Proprietà delle Classi e degli Oggetti in Java

Realizzazione di Politiche di Gestione delle Risorse: i Semafori Privati

UNIVERSITÀ DEGLI STUDI DI BERGAMO

Capitolo 7: Sincronizzazione

Ingegneria del Software

Thread e Task. L20_MultiThread 2

Esercitazione n.1 13 Ottobre Obiettivi:

I thread. Motivazioni e definizione. Modelli di programmazione multithread. Librerie per i thread. Problemi nella programmazione multithread

Primi passi col linguaggio C

Tesina esame Programmazione di Sistemi Mobile Realizzato da Roberto Giuliani Matricola icloud. Inserimenti, modifiche e cancellazioni

Unità Didattica 3 Linguaggio C. Generalità sulle Funzioni. Variabili locali e globali. Passaggio di parametri per valore.

La concorrenza in Java package java.util.concurrent Antonio Furone

Programmazione in Java (I modulo)

PROCESSI NON SEQUENZIALI E TIPI DI INTERAZIONE

Esercitazione 4: Trigger in DB2

Gruppi di Thread. Java threads (3) Gruppi di thread e Timer. Operating Systems. Operating Systems. Java threads 3. Java threads 3

contactsend XMLDelivery engagement marketing contactsend

Input/output da file I/O ANSI e I/O UNIX FLUSSI E FILE FLUSSI FLUSSI di TESTO FLUSSI BINARI FILE

Fondamenti di Informatica T-1 Modulo 2

SQL Server Architettura Client-Server. SQL Server Introduzione all uso di SQL Server Dutto Riccardo.

Strutture Dinamiche. Fondamenti di Informatica

Programmazione Orientata agli Oggetti in Linguaggio Java

Logging in Python. Linguaggi dinamici A.A. 2010/2011 1

Definizione di classi

Soluzioni ai problemi di Mutua Esclusione Primitive di sincronizzazione. Soluzioni ai problemi di Mutua EsclusionePrimitive di sincronizzazione

Definizione di thread Proprietà dei thread in Java Gestione delle priorità nei programmi multithreaded Gruppi di thread Accesso a variabili condivise

PROBLEMI ALGORITMI E PROGRAMMAZIONE

Laboratorio di Sistemi Thread Java

Ogni PC, per iniziare a lavorare, ha bisogno di un sistema operativo. Infatti questo è il primo programma che viene eseguito e che permette

Sistemi Operativi GESTIONE DEI PROCESSI. D. Talia - UNICAL. Sistemi Operativi 4.1

Laboratorio di programmazione

Transcript:

Programmazione multi threaded in Python 1

Motivazione all'uso dei thread Pro Scrittura di applicazioni con molteplici eventi asincroni (GUI) Riduzione della latenza di servizio mediante l'uso di un pool di server Speedup di applicazioni intrinsecamente parallele Contro Modello di programmazione complicato (gestione della mutua esclusione) Debugging scomodo 2

Il modulo threading ESEMPI: thread.py Python mette a disposizione il modulo threading per la programmazione di applicazioni multithreaded import threading Un thread è rappresentato dalla classe Thread, il cui costruttore riceve in ingresso il nome della funzione eseguente il thread t = threading.thread(target = worker) Il metodo start() esegue la funzione in un nuovo thread t.start() 3

Passaggio argomenti ESEMPI: thread_args.py È possibile passare un numero arbitrario di argomenti alla funzione da eseguire Si usa il parametro con nome args della classe Thread t = threading.thread(target = worker, \ args = (TUPLA DI ARGOMENTI)) Si definisce la funzione con la signature opportuna def worker(num):... 4

Identificazione ESEMPI: thread_identify.py Non è strettamente necessario passare un numero intero quale identificatore di un thread Ciascun thread ha già un proprio identificatore interno, che può essere ottenuto come segue Si accede all'oggetto rappresentante il thread corrente tramite il metodo currentthread() Si invoca il metodo getname() su tale oggetto name = threading.currentthread().getname() È possibile impostare un nome arbitrario tramite l'argomento name del costruttore In caso contrario, il nome assegnato di default è del tipo Thread-<num> 5

Identificazione ESEMPI: thread_identify_log.py Il modulo logging supporta la stampa del nome del thread nel log degli eventi È necessario attivare la stampa tramite l'uso della variabile threadname nella stringa di formato del logger logging.basicconfig(level=logging.debug, \ format='[%(levelname)s] (%(threadname)-10s)' \ ' %(message)s',) 6

Thread demoni ESEMPI: thread_daemon.py Negli esempi visti finora, il programma principale ha aspettato il termine dei thread prima di uscire È possibile marcare un thread come demone (daemon) in modo tale che il programma non ne aspetti il termine prima di uscire Si usa il metodo setdaemon() sull'oggetto Thread d = threading.thread(name='daemon', target=daemon) d.setdaemon(true) 7

Sincronizzazione ESEMPI: thread_join.py thread_join_timeout.py Invocando il metodo join() su un oggetto Thread, il programma principale aspetta che il thread associato esca t = threading.thread(name='non-daemon', \ target=daemon) t.join() È possibile limitare l'attesa ad un certo numero di secondi (passati in argomento a join()) t.join(1) Il metodo isalive() dell'oggetto Thread mi dice se il thread è ancora in esecuzione is_alive = t.isalive() 8

Enumerazione ESEMPI: thread_enumerate.py Il metodo enumerate() ritorna una lista di tutti i thread attivi Tale lista contiene il thread attualmente attivo (current) su cui non si può effettuare un join Va saltato main_thread = threading.currentthread() for t in threading.enumerate(): if t is main_thread: continue logging.debug('joining %s', t.getname()) t.join() 9

Estensione di Thread ESEMPI: thread_subclass.py Un oggetto di tipo Thread esegue il metodo run() per eseguire la funzione specificata Si può estendere la classe Thread ed inserire nel metodo run() la funzione da eseguire class MyThread(threading.Thread): def run(self): logging.debug('running') return 10

Estensione di Thread ESEMPI: thread_subc_args.py Per passare argomenti al metodo run, è necessario creare un metodo init () in grado di salvare i parametri in altrettanti attributi della classe Il costruttore della sottoclasse deve invocare esplictamente il costruttore di Thread Tali attributi saranno acceduti da run() 11

Segnalazione di eventi ESEMPI: thread_events.py I thread possono comunicare fra loro usando oggetti di tipo Event Un oggetto di tipo Event espone un flag interno, impostabile con i metodi set(): ad 1 clear(): a 0 Un thread può aspettare l'impostazione ad 1 (set) del flag invocando il metodo wait() dell'oggetto Event corrispondente wait() può accettare un timeout di attesa (sec.) Meccanismo primitivo di variabili condizione (monitor) Le variabili sono in realtà dei flag 12

Mutua esclusione ESEMPI: thread_lock.py Gli oggetti complessi del Python (liste, dizionari, etc.) sono già thread-safe I tipi di dato di base (int, float) non sono threadsafe Le classi scritte dal programmatore non sono thread-safe Per garantire la mutua esclusione, si usa l'oggetto Lock del modulo threading Metodo acquire(): prova ad acquisire il lock Metodo release(): rilascia il lock 13

Semafori ESEMPI: thread_sem.py È possibile gestire un pool di risorse di dimensione n in mutua esclusione Si usa la classe Semaphore() che implementa la struttura dati semaforo Metodo acquire(): prova ad acquisire il lock Metodo release(): rilascia il lock Il costruttore di Semaphore() accetta un numero intero (il numero di slot del pool) 14

Thread local storage ESEMPI: thread_local.py Ciascun thread può usufruire di un'area privata di memoria per la memorizzazione di informazioni Tale area è locale al thread; essa non viene condivisa con gli altri thread in esecuzione Si invoca la funzione local() del modulo threading, ottenendo un puntatore alla variabile locale Si modifica la variabile locale local_data = threading.local() local_data.value = 1000 15