2012-01-24 12 views
6

Il seguente blocco funzione sul suo nucleo in esecuzione?ERLANG wait() e blocco

Una grande risposta descriverà il funzionamento interno di erlang e/o della CPU.

wait(Sec) -> 
    receive 
    after (1000 * Sec) -> ok 
    end. 

risposta

7

Il processo che esegue quel blocco di codice sarà, lo scheduler che corre quel processo attualmente non sarà blocco. Il codice che hai postato è uguale a un rendimento, ma con un timeout.

Lo scheduler di Erlang VM per quel core continuerà ad eseguire altri processi fino a quando non si attiva quel timeout e tale processo verrà pianificato per l'esecuzione di nuovo.

+0

Esiste un equivalente di erlang di 'setTimeout' di NodeJS? È non bloccante per il thread corrente – CMCDragonkai

+0

@CMCDragonkai: o blocchi su una ricezione adesso (con o senza timeout) o non lo fai. Puoi programmare il lavoro tra le tue chiamate 'receive' impostando il timeout su' 0'. Questo significa essenzialmente controllare la tua casella di posta e continuare a lavorare se è vuota. Puoi anche programmare controlli più avanzati usando ad esempio ['send_after/3'] (http://erlang.org/doc/man/erlang.html#send_after-3). –

2

Risposta breve: bloccherà solo il processo corrente (leggero) e non bloccherà tutta la VM. Per maggiori dettagli è necessario leggere su erlang scheduler. Bella descrizione tratta dal libro "Concurent Programming" di Francesco Cesarini e Simon Thompson.

... snip ... Quando un processo viene inviato, viene assegnato un numero di riduzioni † è autorizzato ad eseguire, un numero che si riduce per ogni operazione eseguita. Non appena il processo entra in una clausola di ricezione dove nessuno dei messaggi corrisponde o il suo conteggio di riduzione raggiunge lo zero, viene preempito. Finché i BIF non vengono eseguiti, questa strategia determina un'allocazione equa (ma non uguale) dell'esecuzione di tempo tra i processi. ... snip ...

1

niente di specifico, un problema piuttosto classico: i timeout possono verificarsi solo in caso di interruzione dell'orologio di sistema. La stessa risposta di sopra: quel processo è bloccato in attesa dell'interruzione dell'orologio, tutto il resto funziona perfettamente.

C'è un'altra discussione sul tempo effettivo che il processo sta per attendere, che non è esattamente preciso perché dipende dal periodo di clock (e dipende dal sistema), ma questo è un altro argomento.