Python - ищет способ остановить временно вызываемую функцию в цикле infinte while - PullRequest
0 голосов
/ 03 мая 2011

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

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

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

я хочу, чтобы myFunction () запускалась не чаще одного раза в две минуты.я мог бы поместить в него ожидание (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), и мне кажется, что я не могу отследить выполнение, чтобы увидеть, как это выполняется.

Ответы [ 2 ]

2 голосов
/ 03 мая 2011

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

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()
0 голосов
/ 03 мая 2011

Вы всегда устанавливаете «сейчас» на текущее время. В ветке else вы всегда устанавливаете «тогда» на сейчас. Таким образом, 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
...