Python — ищу способ временно остановить вызов функции в бесконечном цикле while

#python #sikuli

#python #sikuli

Вопрос:

у меня есть цикл while в качестве моей основной функции. в нем я проверяю несколько операторов IF и вызываю функции соответствующим образом. одну конкретную функцию я не хочу вызывать, если она уже была запущена в течение последних двух минут. я не хочу помещать оператор WAIT() в функцию, потому что я хочу, чтобы другие тесты IF выполнялись в течение этого времени.

код выглядит примерно так перед любой попыткой приостановить myFunction()

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

я хочу, чтобы myFunction () запускалась не чаще одного раза в две минуты. я мог бы поместить в него wait (120), но это предотвратило бы вызов OtherFunction() в это время.

я пытался

 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
  

безуспешно. не уверен, правильный ли это подход, и если да, то корректен ли этот код. я впервые работаю на Python (на самом деле Sikuli), и, похоже, я не могу отследить выполнение, чтобы увидеть, как это выполняется.

Комментарии:

1. set неверное имя переменной. Это маскирует set() команду.

Ответ №1:

Я думаю, что вы в принципе на правильном пути, но вот как я бы это реализовал:

 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()
  

Редактировать

Вот слегка оптимизированная версия:

 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()
  

Комментарии:

1. спасибо за ваше решение. я впервые использую stack overflow, и я в восторге от того, что могу воспользоваться вашим опытом. — Antikythera

2. @Anti: Ты welcome…to ИТАК. Кстати, в Python, в отличие от многих других языков программирования, вам, вероятно, не нужно заключать в круглые скобки test , т.е. просто if test или if test and ... — они не причиняют вреда, но это довольно наивно.

Ответ №2:

Вы всегда устанавливаете «now» на текущее время. В ветке else вы всегда устанавливаете «тогда» на now. Таким образом, diff — это всегда время, прошедшее между двумя последними исполнениями предложения if. Значение «set» изменяется только в вашем коде и никогда не возвращается к «0».

Вместо этого вы могли бы сделать что-то вроде этого (предупреждение: непроверенный код):

 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