2009-05-22 10 views
67

¿Cómo puedo dormir por menos de un segundo en Perl?¿Cómo puedo dormir durante un milisegundo en Perl?

+21

Es porque creo que este título es realmente más útil. Déjame intentar argumentar esto. Qué B.D.F. hizo fue duplicar la pregunta en el título que no agrega expresividad. Cuando buscaba la respuesta en la web, en realidad buscaba un sueño de un milisegundo y no un sueño "más corto que un segundo". Digo que esta versión tiene más posibilidades de ser golpeada a través de diferentes búsquedas de Google que la de B.D.F. Por favor corrígeme si estoy equivocado. –

Respuesta

97

Desde la página Perldoc en sleep:

Para retrasos de granularidad más fina que un segundo, el módulo Time::HiRes (de CPAN, y partiendo de Perl 5,8 parte de la distribución estándar) proporciona usleep().

En realidad, se proporciona usleep() (que duerme en microsegundos) y nanosleep() (que duerme en nanosegundos). Es posible que desee usleep(), lo que le permitirá lidiar con números más fáciles. 1 milisegundo sueño (utilizando cada uno):

use strict; 
use warnings; 

use Time::HiRes qw(usleep nanosleep); 

# 1 millisecond == 1000 microseconds 
usleep(1000); 
# 1 microsecond == 1000 nanoseconds 
nanosleep(1000000); 

Si no quiere (o no puede) cargar un módulo para hacer esto, es posible que también será capaz de utilizar el incorporado en select() función:

# Sleep for 250 milliseconds 
select(undef, undef, undef, 0.25); 
+5

Advertencia: aunque podría nanosleep (1), muchos sistemas operativos tienen una granularidad mínima; p.ej. Creo que es 1 ms en Windows XP, por lo que aún dormiría allí por 1000000 ns. – Piskvor

+8

La página de Time :: HiRes dice algo así como "si necesita nanosleep(), debería reconsiderar si Perl es o no la mejor herramienta para su trabajo". –

+3

También hay Time :: HiRes :: sleep (0.3) que dormirá durante .3 de segundo. –

4

Un rápido google en "perl alta resolución temporizadores" dio una referencia a Time::HiRes. Tal vez eso es lo que quieres.

12

de perlfaq8:


¿Cómo puedo dormir() o alarma() por menos de un segundo?

Si desea una granularidad más fina que el 1 segundo que proporciona la función sleep(), la forma más fácil es usar la función select() como se documenta en select in perlfunc. Pruebe los módulos Time :: HiRes y BSD :: Itimer (disponibles en CPAN, y a partir de Perl 5.8 Time :: HiRes forma parte de la distribución estándar).

-3
system "sleep 0.1"; 

hace el truco.

Cuestiones relacionadas