Таймер для определенного выполнения кода на python

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

def f1(): while True: print("q")

def f2(): time.sleep(3)


Ответы (1 шт):

Автор решения: i-aztec

Для реализации такого сценария в Python можно использовать многопоточность (модуль threading) или асинхронное программирование (модуль asyncio). Но у вас в тегах указано asyncio, поэтому я напишу пример с помощь этой библиотеки.

Вот пример кода:

import asyncio

async def print_symbols():
    """Асинхронная функция, которая печатает символы, пока не завершится другая задача."""
    try:
        while True:
            print("q", end=" ", flush=True)
            await asyncio.sleep(0.1)  # Асинхронная задержка
    except asyncio.CancelledError:
        print("\nPrinting stopped.")
        raise  # Повторно вызываем исключение, чтобы корректно завершить задачу

async def countdown(seconds):
    """Асинхронная функция, которая отсчитывает время."""
    print(f"\nStarting countdown for {seconds} seconds...")
    await asyncio.sleep(seconds)  # Асинхронная задержка на указанное время
    print("\nTime is up!")

async def main():
    """Основная функция для запуска задач."""
    # Запускаем задачу печати символов
    print_task = asyncio.create_task(print_symbols())
    
    # Запускаем задачу отсчета времени
    await countdown(3)
    
    # После завершения countdown отменяем задачу печати
    print_task.cancel()
    
    try:
        await print_task  # Ждем завершения задачи печати (обработка отмены)
    except asyncio.CancelledError:
        pass  # Игнорируем ошибку отмены

if __name__ == "__main__":
    # Запускаем асинхронный цикл событий
    asyncio.run(main())

При запуске программы вы увидите что-то вроде этого:

Starting countdown for 3 seconds...
q q q q q q q q q q q q q q q q q q q q q q q q q q q
Time is up!

Printing stopped.
→ Ссылка