2012-01-24 12 views
6

¿La siguiente función bloquea su núcleo en ejecución?ERLANG wait() y bloqueo

Una excelente respuesta detallará el funcionamiento interno de erlang y/o la CPU.

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

Respuesta

7

El proceso que ejecuta ese bloque de código se , el planificador que se ejecuta ese proceso actualmente voluntad no bloque. El código que publica es igual a un rendimiento, pero con un tiempo de espera excedido.

El programador de VM de Erlang para ese núcleo continuará ejecutando otros procesos hasta que el tiempo de espera se dispare y ese proceso se programará para su ejecución nuevamente.

+0

¿Hay un equivalente erlang del 'setTimeout' de NodeJS? Es no bloqueante para el hilo actual – CMCDragonkai

+0

@CMCDragonkai: O bloquea en una recepción en este momento (con o sin tiempo de espera), o no lo hace. Puede programar el trabajo entre sus llamadas 'receive' estableciendo el tiempo de espera en' 0'. Esto básicamente significa revisar su bandeja de entrada y continuar trabajando si está vacía. También puede programar verificaciones más avanzadas utilizando, por ejemplo, ['send_after/3'] (http://erlang.org/doc/man/erlang.html#send_after-3). –

2

Respuesta breve: esto bloqueará solo el proceso actual (ligero) y no bloqueará todas las máquinas virtuales. Para obtener más información, debe leer sobre el programador de Erlang. Una buena descripción proviene del libro "Concurent Programming" de Francesco Cesarini y Simon Thompson.

... tijeretazo ... Cuando se envía un proceso, se le asigna un número de reducciones † se le permite ejecutar, un número que se reduce por cada operación ejecutada. Tan pronto como el proceso ingrese una cláusula de recepción donde ninguno de los mensajes coincide o su conteo de reducción llega a cero , se reemplaza. Mientras no se ejecuten los BIF, esta estrategia da como resultado una asignación equitativa (pero no igual) del tiempo de ejecución entre los procesos. ... snip ...

1

nada Erlang específico, problema bastante clásico: los tiempos de espera solo pueden ocurrir en una interrupción del reloj del sistema. La misma respuesta que la anterior: ese proceso está bloqueado esperando la interrupción del reloj, todo lo demás está funcionando bien.

Hay otra discusión sobre el tiempo real que esperará el proceso, que no es exactamente exacto porque depende del período del reloj (y depende del sistema), pero ese es otro tema.