SerenePawn
@SerenePawn

Как создать таймер, работающий асинхронно, при этом получать его состояние?

Хочу реализовать в цикле для каждого условия таймер. То есть
While True:
    if *** == 'first choice':
        # Do something
        time.sleep(5)
    if *** == 'second choice':
        # Do something
        time.sleep(5)

Но при этом, чтобы эти таймеры работали асинхронно, где-то в фоне. Чтобы я мог сделать им запрос *.is_running() и если получу True, то оборвать цикл. Как такое вообще реализовать?
С asyncio я поломал себе всю голову и мало что понял, а реализовать это костыльно через одни if-ы - как-то "непрофессионально" и некрасиво. Если то, что я описал, не возможно, то какие еще есть варианты?
  • Вопрос задан
  • 1103 просмотра
Пригласить эксперта
Ответы на вопрос 1
@FulTupFul
time.sleep() остановливает весь поток целиком, блокирует выполнение других операций на заданное время.
В asyncio есть своя реализация метода sleep, которая остановливает выполнение корутины, позволяя передать контекст другим корутинам.
Если вам нужно оборвать выполнение программы при достижении определенного условия. Вы можете это сделать при помощи потоков.
Синхронная реализация
from threading import Thread
import time


class CustomThread(Thread):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.is_running = True

    def run(self):
        while self.is_running:
            if "" == 'first choice':
                time.sleep(5)
            if "" == 'second choice':
                # Do something
                time.sleep(5)

    def terminate(self):
        self.is_running = False
        

thread = CustomThread(daemon=True)
thread.start()  # Запускаем thread
thread.terminate()  # Останавливаем thread
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы