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.
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.
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.
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 ...
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.
Esiste un equivalente di erlang di 'setTimeout' di NodeJS? È non bloccante per il thread corrente – CMCDragonkai
@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). –