2011-04-06 10 views

Respuesta

30

Desde usleep generalmente significa que desea retrasar la ejecución de x microsegundos, se debe dividir el valor por segundo 1000000.

import time 
time.sleep(seconds/1000000.0) 

time.sleep() toma como parámetro segundos.

http://docs.python.org/library/time.html#time.sleep

+7

Cuidado, lea sobre la [precisión del sueño()] (http://stackoverflow.com/questions/1133857/how-accurate-is-pythons-time-sleep) – x29a

2
from time import sleep 
sleep(seconds) 

More info.

6
from time import sleep 
sleep(0.1) #sleep during 100ms 
20
import time 
usleep = lambda x: time.sleep(x/1000000.0) 

usleep(100) #sleep during 100μs 
2

ser muy, muy cuidadoso con time.sleep. Me quemó python3 usando time.sleep porque no es monótono. Si el reloj de pared cambia hacia atrás, la llamada de tiempo muerto no terminará hasta que el reloj de pared se ponga al día con lo que hubiera sido si el sueño hubiera avanzado como estaba previsto. Todavía no he encontrado un sueño monotónico bloqueado para Python.

En cambio, recomiendo Event.wait, así:

def call_repeatedly(interval, func, *args, **kwargs): 
    stopped = Event() 
    def loop(): 
     while not stopped.wait(interval): # the first call is in `interval` secs 
      try: 
       func(*args) 
      except Exception as e: 
       logger.error(e); 
       if kwargs.get('exception'): 
        kwargs.get('exception')(e) # SEND exception to the specified function if there is one. 
       else: 
        raise Exception(e) 
    Thread(target=loop).start() 
    return stopped.set 

http://pastebin.com/0rZdY8gB

+0

¿desea agregar el código? – manetsus

+0

Claro, me encantaría: [http://pastebin.com/0rZdY8gB] (http://pastebin.com/0rZdY8gB) – SynaTree

+0

Creo que 'time.sleep' ahora debería ser monotónico en Python 3; al menos, el [código fuente] (https://github.com/python/cpython/blob/v3.6.3/Modules/timemodule.c#L1430) dice '_PyTime_GetMonotonicClock()' para obtener la hora actual. No puedo decir con certeza cómo fue el comportamiento anterior. – user2357112

-3

¿qué tal esto:

import time 
def usleep(delay): 
    mdelay = delay /1000 
    now = time.time() 
    while now + mdelay > time.time(): 
     pass 
+0

¿Consume 100% de CPU hasta que la demora haya terminado? Esto es lo que hicieron los desarrolladores en los días de MSDOS, por favor no haga esto en los sistemas modernos de multitareas. Con 'time.sleep()' le dices al núcleo del sistema operativo que deje tu proceso en pausa hasta que se complete el tiempo de espera, por lo que todos los demás procesos pueden hacer su trabajo. – vdboor

+0

Esto podría consumir el 100% de la CPU, pero al menos es mucho más preciso que el modo de suspensión. Si tiene que dormir mucho para mantener el tiempo, p. cuando bitbanging un protocolo en un Rapsberry Pi time.sleep() es a veces WAY de (¡estoy hablando de un factor 20!) – Dakkaron

+1

Manteniendo la CPU cargada al 100% puedes ralentizar el reloj si tu reloj fuente se ve afectado por la carga del sistema y cae de voltaje ... Ten en cuenta que no solo perderás la precisión de dormir de esa manera – Andrew

1

una función alternativa del sueño para el pitón.

Nota: No se debe utilizar para varios subprocesos debido al bloqueo GIL, pero para subprocesos múltiples está bien. Lo mismo con time.sleep()

Estoy envolviendo una función C en Python. Estoy usando nanosleep() de la biblioteca C, que detiene el hilo que se ejecuta durante tanto tiempo. No es un tipo de retraso de espera ocupado que usa mucha CPU para evaluar algunas matemáticas. Los códigos son los siguientes. Pon todo en una carpeta, di CWrapper.

C_functions.h

#include <time.h> 
int c_sleep_msec(long milliseconds); 
int c_sleep_nsec(long nanoseconds); 

C_functions.c

#include "C_functions.h" 
int c_sleep_msec(long milliseconds) { 
    struct timespec req; 
    //struct timespec rem; 
    if(milliseconds > 999) { 
     req.tv_sec = (int)(milliseconds/1000); /* Must be Non-Negative */ 
     req.tv_nsec = (milliseconds - ((long)req.tv_sec * 1000)) * 1000000; /* Must be in range of 0 to 999999999 */ 
    } 
    else { 
     req.tv_sec = 0;       /* Must be Non-Negative */ 
     req.tv_nsec = milliseconds * 1000000; /* Must be in range of 0 to 999999999 */ 
    } 
    //rem = NULL; 
    return nanosleep(&req , NULL); 
} 
//------------------------------------------------------ 
int c_sleep_nsec(long nanoseconds) { 
    struct timespec req; 
    //struct timespec rem; 
    if (nanoseconds > 999999999) { 
     req.tv_sec = (int)(nanoseconds/1000000000); 
     req.tv_nsec = (nanoseconds - ((long)req.tv_sec * 1000000000)); 
    } 
    else { 
     req.tv_sec = 0; 
     req.tv_nsec = nanoseconds; 
    } 
    //rem = NULL; 
    return nanosleep(&req , NULL); 
} 

También puede crear una función para micro segundos usando el mismo nanosleep()

CWrapper.pyx

cdef extern from "C_functions.h": 
    int c_sleep_msec(long milliseconds) 
    int c_sleep_nsec(long nanoseconds) 

def sleep_msec(milliseconds): 
    return c_sleep_msec(milliseconds) 

def sleep_nsec(nanoseconds): 
    return c_sleep_nsec(nanoseconds) 

setup.py

from distutils.core import setup 
from distutils.extension import Extension 
from Pyrex.Distutils import build_ext 

setup(
    name = "CWrapper", 
    ext_modules=[ Extension("CWrapper", ["CWrapper.pyx", "C_functions.c"]) ], 
    cmdclass = {'build_ext': build_ext} 
) 

Instalar python-pyrex. A continuación, ejecute en el terminal de Linux

python setup.py build_ext -i 

Se va a crear CWrapper.c, construir y archivos CWrapper.so. Use CWrapper.so donde quiera, y solo importe en python.

Nota: compilar por separado para Raspberry Pi.

Ahora, probar la función

Test_sleep.py

import serial 
from multiprocessing import Process 
import time 
import CWrapper 


class TestSleep: 
    def __init__(self): 
     self.delay_sec = 0.00000100 
     self.delay_msec = 30 
     self.delay_nsec = 1000 #200000000 
     self.start_time = time.time() 

     self.process_1 = Process(name="process_1", target=self.process_1_task, args=("process_1",)) 
     self.process_1.daemon = True 
     self.process_1.start() 

     self.process_2 = Process(name="process_2", target=self.process_1_task, args=("process_2",)) 
     self.process_2.daemon = True 
     self.process_2.start() 

     self.process_3 = Process(name="process_3", target=self.process_1_task, args=("process_3",)) 
     self.process_3.daemon = True 
     self.process_3.start() 

    def process_1_task(self, process_name): 
     start = self.start_time 
     delay_msec = self.delay_msec 
     delay_sec = self.delay_sec 
     delay_nsec = self.delay_nsec 

     t1 = start 
     for i in range(1, 81): 
      status = CWrapper.sleep_msec(delay_msec) 
      # status = CWrapper.sleep_nsec(delay_nsec) 
      #status = time.sleep(delay_sec) 
      t2 = time.time() 
      elapsed_time = t2 - t1 
      t1 = t2 
      print process_name, i, "status:", status, "Elapsed-time:", elapsed_time 


if __name__ == '__main__': 
    test = TestSleep() 
    # for i in range(1,10000): 
    #  print "main thread", i 
     # time.sleep(0.1) 
    while True: # Since daemon=True, main thread should check join() or stay in loop 
     pass 

variar los parámetros delay_sec para time.sleep(), delay_msec para CWrapper.sleep_msec(), delay_nsec para CWrapper.sleep_nsec(). Descomente la función que desea probar en thread_1_task().

+0

¿Así que aquí es donde copiaste esta publicación? Su ejemplo todavía está abusando de los hilos (tanto que están ocupados girando y evitando que se ejecuten) por lo que la comparación no se sostiene. Al abordar un problema percibido, defínalo mejor que "incorrecto". –

+0

En cuanto a su prueba, no es el sueño que espera ocupado, sigue siendo su hilo principal; las rutinas que escribió simplemente detienen * todos * los hilos de Python. –

+0

Lea http://docs.cython.org/en/latest/src/userguide/external_C_code.html#acquiring-and-releasing-the-gil –