Python: busca una manera de detener una función que se llama temporalmente en un infinte mientras

StackOverflow https://stackoverflow.com/questions/5866875

  •  28-10-2019
  •  | 
  •  

Pregunta

Tengo un bucle de tiempo como mi función principal. Dentro de él verifique varias declaraciones de IF y las funciones de llamadas en consecuencia. Una función en particular que no quiero llamar si ya se ha ejecutado en los últimos dos minutos. No quiero poner una declaración Wait () en la función porque quiero que las otras pruebas se realicen dudando en ese tiempo.

El código es algo como esto antes de cualquier intento de pausar myFunction ()

while not(exit condition):
    if(test):
        otherFunction()
    if(test):
        otherFunction()
    if(test):
        myFunction()

Quiero que myFunction () solo funcione como máximo una vez cada dos minutos. Podría poner una espera (120) dentro de él, pero eso evitaría que se llame otra función () en ese momento.

Lo intenté

import time

set = 0
while not(exit condition):
    if(test):
        otherFunction()
    if(test):
        otherFunction()
    if(test):
        now = time.clock()
        diff = 0
        if not(set):
            then = 0
            set = 1
        else:
            diff = now - then
            if (diff > 120):
            myFunction()
            then = now

sin éxito. No estoy seguro si es el enfoque correcto, y si lo es, si este código es correcto. Mi primera vez trabajando en Python (en realidad Sikuli) y no parece que pueda rastrear la ejecución para ver cómo se está ejecutando.

¿Fue útil?

Solución

Creo que estás básicamente en el camino correcto, pero así es como lo implementaría:

import time

MIN_TIME_DELTA = 120

last_call = time.clock() - (MIN_TIME_DELTA+1)  # init to longer than delta ago
while not exit_condition:
    if test:
        otherFunction()
    if test:
        anotherFunction()
    if test and ((time.clock()-last_call) > MIN_TIME_DELTA):
        last_call = time.clock()
        myFunction()

Editar

Aquí hay una versión ligeramente optimizada:

next_call = time.clock() - 1  # init to a little before now
while not exit_condition:
    if test:
        otherFunction()
    if test:
        anotherFunction()
    if test and (time.clock() > next_call):
        next_call = time.clock() + MIN_TIME_DELTA
        myFunction()

Otros consejos

Siempre establece "ahora" en la hora actual. En la sucursal de Else siempre establece "entonces" para ahora. Entonces, Diff es siempre el tiempo que pasó entre las dos últimas ejecuciones de la cláusula IF. El valor de "SET" solo se cambia en su código y nunca se retrasa en "0".

Podrías hacer algo como esto (advertencia: código no probado):

import time

set = 0
last_call_time = time.clock()

while not(exit condition):
    if(test):
        otherFunction()
    if(test):
        otherFunction()
    if(test):
        now = time.clock()
        diff = now - last_call_time
        if (diff > 120)
            myFunction()
            last_call_time = now
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top