Выполнить другую функцию если первая выполняется дольше 15 секунд?

Для выполнения другой функции, если первая выполняется дольше 15 секунд, можно использовать механизм многопоточности или асинхронности в Python. Давайте рассмотрим оба варианта.

1. Многопоточность:
В Python есть модуль threading, который позволяет создавать и управлять потоками выполнения. Мы можем создать два потока, один для первой функции, а другой для второй функции. Затем мы можем запустить первую функцию в первом потоке и установить тайм-аут в 15 секунд. Если выполнение первой функции занимает больше времени, чем указанный тайм-аут, мы можем прервать ее выполнение и запустить вторую функцию во втором потоке.

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

   import threading
   import time

   def first_function():
       # Долгий блокирующий код первой функции
       time.sleep(20)

   def second_function():
       # Код второй функции
       print("Вторая функция выполняется")

   def run_functions():
       # Создаем и запускаем первый поток для первой функции
       thread = threading.Thread(target=first_function)
       thread.start()

       # Ждем 15 секунд
       thread.join(timeout=15)

       # Если первая функция все еще выполняется, то прерываем ее и запускаем вторую функцию
       if thread.is_alive():
           print("Первая функция занимает слишком много времени, запускаем вторую функцию")
           second_function()

   run_functions()

В этом примере мы создаем две функции: first_function и second_function. Первая функция имитирует блокирующий код, который выполняется в течение 20 секунд. Вторая функция просто выводит сообщение. Затем мы создаем функцию run_functions, которая создает поток для первой функции, запускает его и ждет 15 секунд. Если первая функция все еще выполняется через указанный тайм-аут, мы прерываем ее выполнение и запускаем вторую функцию.

2. Асинхронность:
В Python есть модуль asyncio, который предоставляет механизм асинхронного выполнения кода. Мы можем использовать этот модуль для выполнения двух функций на основе асинхронных задач. Мы также можем использовать asyncio.wait_for() для установки тайм-аута в 15 секунд для первой функции.

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

   import asyncio

   async def first_function():
       # Долгий блокирующий код первой функции
       await asyncio.sleep(20)

   async def second_function():
       # Код второй функции
       print("Вторая функция выполняется")

   async def run_functions():
       # Создаем задачи для первой и второй функций
       tasks = [first_function(), second_function()]

       # Ждем, пока либо первая функция выполнится, либо будет превышен тайм-аут
       done, _ = await asyncio.wait(tasks, timeout=15, return_when=asyncio.FIRST_COMPLETED)

       # Если первая функция все еще выполняется, то прерываем ее и запускаем вторую функцию
       if len(done) == 0:
           print("Первая функция занимает слишком много времени, запускаем вторую функцию")
           await asyncio.wait_for(second_function(), timeout=5)

   asyncio.run(run_functions())

В этом примере мы определяем две асинхронные функции: first_function и second_function. Первая функция имитирует блокирующий код, который выполняется в течение 20 секунд. Вторая функция просто выводит сообщение. Затем мы определяем функцию run_functions, которая создает задачи для первой и второй функций, используя asyncio.wait() для ожидания выполнения одной из задач или истечения заданного таймаута. Если первая функция все еще выполняется через указанный тайм-аут, мы прерываем ее выполнение и запускаем вторую функцию с использованием asyncio.wait_for().

Оба этих подхода могут быть использованы для выполнения другой функции, если первая выполняется дольше 15 секунд в Python. В зависимости от вашего удобства и требований проекта вы можете выбрать подход, лучше всего подходящий вам.