Estaba buscando una función usleep() en Python 2.7.usleep en Python
¿Alguien sabe si existe, quizás con otro nombre de función?
Estaba buscando una función usleep() en Python 2.7.usleep en Python
¿Alguien sabe si existe, quizás con otro nombre de función?
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.
from time import sleep
sleep(seconds)
from time import sleep
sleep(0.1) #sleep during 100ms
import time
usleep = lambda x: time.sleep(x/1000000.0)
usleep(100) #sleep during 100μs
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
¿desea agregar el código? – manetsus
Claro, me encantaría: [http://pastebin.com/0rZdY8gB] (http://pastebin.com/0rZdY8gB) – SynaTree
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
¿qué tal esto:
import time
def usleep(delay):
mdelay = delay /1000
now = time.time()
while now + mdelay > time.time():
pass
¿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
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
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
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().
¿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". –
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. –
Lea http://docs.cython.org/en/latest/src/userguide/external_C_code.html#acquiring-and-releasing-the-gil –
Cuidado, lea sobre la [precisión del sueño()] (http://stackoverflow.com/questions/1133857/how-accurate-is-pythons-time-sleep) – x29a