Size: 2590
Comment:
|
Size: 2629
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 23: | Line 23: |
Al momento della '''chiamata''' della funzione il dispatcher riceve tramite il channel la chiamata e anche il controllo da parte dello scheduler. Il dispatcher esegue le chiamate una alla volta, senza avviare altri microthreads. | Al momento della '''chiamata''' della funzione il dispatcher riceve tramite il channel la chiamata e lo scheduler viene informato che il dispatcher è in attesa di eseguire del codice. Il dispatcher esegue le chiamate una alla volta, senza avviare altri microthreads. |
Il modulo micro
Ha una funzione per richiamare altre funzioni come microthread (micro e microatomic), una classe per la creazione di canali (Channel) e un decorator (microfunc) per definire una funzione che sarà sempre eseguita in microthreads.
Una funzione può essere dichiarata in uno di questi modi:
@microfunc() def funzione_da_eseguire(param1, param2): print param1, param2 @microfunc(is_micro=True) # possibili args sono is_micro=False e is_atomic=False def funzione_da_eseguire(param1, param2): print param1, param2 @microfunc(is_atomic=True) def funzione_da_eseguire(param1, param2): print param1, param2
Se si usa la modalità default (la prima) al momento della definizione della funzione viene avviato in un microthread un dispatcher per quella funzione che sta in ascolto su un channel (vedi la classe Channel con prefer_sender = True e micro_send = False).
Al momento della chiamata della funzione il dispatcher riceve tramite il channel la chiamata e lo scheduler viene informato che il dispatcher è in attesa di eseguire del codice. Il dispatcher esegue le chiamate una alla volta, senza avviare altri microthreads.
In realtà bisogna aggiungere che al posto di un channel è usato un oggetto Channel e il passaggio dei dati (cioè gli argomenti della chiamata) avviene con i metodi sendq e recvq (vedi la classe Channel). Questo significa che se il dispatcher non è pronto a ricevere al momento della chiamata della funzione, il chiamante accoda i dati in una sequence e questo evita che si blocchi il chiamante.
Questo meccanismo fa si che ci sia un solo microthread per l'esecuzione di una certa funzione, e che in esso le varie chiamate siano eseguite in sequenza. Ma allo stesso tempo si ottiene che il chiamante di quella funzione non risulti mai bloccato dalla chiamata.
Se si usa la modalità is_micro si ottiene una funzione che, quando chiamata, viene eseguita in un nuovo microthread.
In questo caso ogni chiamata produce un microthread e quindi, naturalmente, il chiamante non risulta mai bloccato dalla chiamata. Diversamente dalla prima modalità si ha che le varie chiamate possono venire eseguite in parallelo.
Se si usa la modalità is_atomic si ottiene una funzione che, quando chiamata, viene eseguita in un microthread che non sarà mai interrotto fino alla sua terminazione.
Per ora la modalità is_atomic non è stata mai usata nel codice.