Прекращение работы функции по таймауту без остановки работы главного потока

Предположим у меня есть следующий функционал


from apscheduler.schedulers.background import BackgroundScheduler
import time
import random

def function():
    time.sleep(random.randint(30, 60))

def scheduled_task():
    function()

if __name__ == '__main__':
    sched = BackgroundScheduler(daemon=True)
    sched.add_job(scheduled_task, 'interval', seconds=2)
    sched.start()

Я хотел бы получить возможность останавливать выполнение функции function в том случае, если время выполнения превысило 45 секунд, не останавливая при этом BackgroundScheduler Как вы видите, в функции нет иттераций, поэтому я не могу использовать решение, предложенное здесь

Я нашел следующее решение, которое позволяет остановить выполнение функции:

from __future__ import print_function
import sys
import threading
try:
    import thread
except ImportError:
    import _thread as thread

class Breaker:
    def __init__(self):
        pass

    def exit_after(self, s):
        """
        use as decorator to exit process if
        function takes longer than s seconds
        """

        def outer(fn):
            def inner(*args, **kwargs):
                print("Отсчет пошел")
                timer = threading.Timer(s, self.quit_function, args=[fn.__name__])
                timer.start()
                try:
                    result = fn(*args, **kwargs)
                finally:
                    timer.cancel()
                return result
            return inner
        return outer

    @staticmethod
    def quit_function(fn_name):
        # print to stderr, unbuffered in Python 2.
        print('Время выполнение {0} превысило лимит'.format(fn_name))
        sys.stderr.flush()
        thread.interrupt_main()

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


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