Остановка первого выполнения функции при втором выполнении (Python) - PullRequest
1 голос
/ 10 июля 2020

У меня есть функция, которая вызывается при загрузке страницы, но ее также можно вызвать с помощью кнопки. Когда страница загружается, вызывается функция - она ​​просто ждет 15 секунд, а затем завершается. С другой стороны, если пользователь нажимает кнопку до истечения 15 секунд, функция вызывается снова и немедленно завершается. Можно ли нажать эту кнопку, чтобы остановить первый вызов функции?

#the first execution is called with the default value for the "chosen" argument.
#the second one (on button press) is always called with a non-zero value for "chosen"

def background_calculation(self, chosen=0):
    if chosen == 0:
        time.sleep(15)
        pos = np.random.randint(1, 54)
        return pos
    else:
        pos = chosen
        #I would like to stop the first function call from continuing to execute here.
        return pos

Контекст: background_calculation вызывается при открытии потока. У пользователя есть 15 секунд, чтобы сделать выбор, и если они этого не сделают, поток должен закрываться со случайным значением для pos. С другой стороны, если пользователь делает выбор до истечения 15 секунд, функция вызывается, и поток немедленно завершается с возвращением выбранного пользователем значения. В настоящее время функция выполняется дважды и возвращает два значения: выбранное пользователем и случайно созданное.

Что я пробовал: я пробовал использовать индикатор / фиктивную переменную, которая указывает на последнее значение «selected ". По истечении 15 секунд функция проверит, указывает ли фиктивная переменная на 0 (это означает, что выбранный параметр никогда не изменялся), и остановится, если это не так.

1 Ответ

1 голос
/ 10 июля 2020

Вероятно, вы захотите сохранить глобальное состояние:

button_clicked = False

def background_calculation(self, chosen=0):
    if chosen == 0:
        for i in range(15):
            time.sleep(1)
            if button_clicked: # user clicks the button
                break
        else:
            pos = np.random.randint(1, 54)
            return pos
    
    else: # chosen = 1
        global button_clicked
        button_clicked = True
        
        pos = np.random.randint(1, 54)
        return pos

Обратите внимание, что эта реализация просто показывает вам, как мы обнаруживаем нажатие кнопки.

Предупреждение: это не является поточно-ориентированным для прямого вызова.

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

from threading import Lock

with Lock():
    background_calculation(self, chosen=0) # or 1

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...