Как сделать чтобы функция не работала во время работы другой?

Рейтинг: 1Ответов: 1Опубликовано: 01.06.2023

Можно ли сделать так, чтобы task2 не выполнялся пока работает task? К примеру условием

import time

class A:
    def task():
        print("Начало проверки")
        time.sleep(3)
        print("Проверка завершена 23:30")
        global VREMYA
        VREMYA = '23:30' #переменная времени окончания проверки

    def task2():
        if time.strftime("%H:%M") > VREMYA:
            print("Условие выполнено")
        else:
            pass

Ответы

▲ 2

Можно использовать threading для реализации блокировок, но метод не самый простой и надёжный.

import time
import threading

class A:
    def __init__(self):
        self.lock = threading.Lock()  #### Создаем блокировку

    def task(self):
        print("Начало проверки")
        time.sleep(3)
        print("Проверка завершена 23:30")
        global VREMYA
        VREMYA = '23:30' #### переменная времени окончания проверки
        self.lock.release()  #### Разблокируем блокировку

    def task2(self):
        self.lock.acquire()  #### Захватываем блокировку
        if time.strftime("%H:%M") > VREMYA:
            print("Условие выполнено")
        else:
            pass
        self.lock.release()  #### Разблокируем блокировку

a = A()
t1 = threading.Thread(target=a.task)
t2 = threading.Thread(target=a.task2)

t1.start()  #### Запускаем задачу task в отдельном потоке
t1.join()   #### Ожидание завершения task

t2.start()  #### Запуск task2 в отдельном потоке после завершения task

Можно использовать флаги ожидания:

import time

class A:
    def __init__(self):
        self.task_running = False

    def task(self):
        self.task_running = True
        print("Начало проверки")
        time.sleep(3)
        print("Проверка завершена 23:30")
        global VREMYA
        VREMYA = '23:30' #### переменная времени окончания проверки
        self.task_running = False

    def task2(self):
        while self.task_running:
            time.sleep(1)
        if time.strftime("%H:%M") > VREMYA:
            print("Условие выполнено")
        else:
            pass

Флаг task_running устанавливается в True при выполнении task и сбрасывается в False после его завершения. В функции task2 происходит проверка флага task_running, и если он установлен в True, то task2 ждет, выполняя паузу каждую секунду, пока task не завершится.

Есть ещё способ через модуль queue, но там выполнение идёт последовательно.