Остановка функции третьей стороны

Это часть сложного проекта, я попробую и упрощу его.

У меня есть класс, который получает вызываемый и выполняет его, вызываемый может работать в течение любого времени. Если я получу сигнал (могу использовать Сигнал или любой другой флаг, который я смотрю), чтобы закончить, я хочу прекратить выполнение вызываемого вызова на месте (без выхода из процесса, конечно)

  • Python: Как получить вход с консоли, когда работает бесконечный цикл?
  • Какова цель контекстных стеков Flask?
  • Как работает heapq.nlargest?
  • Изменение количества итераций в цикле for
  • Сброс объекта генератора в Python
  • Считываемый эквивалент C # операции кусочка Python
  • class FooRunner(object): def goo(self, foo): try: foo() except: pass def on_stop_signal(self): pass 

  • Как получить одно значение от генератора в Python?
  • Не удается запустить пример кода, упомянутого в документах Flask
  • Python - фиксированный показатель в научной нотации?
  • Член сеанса фляжки не сохраняется в запросах
  • Как я могу проверить тип переменных в Python?
  • Поддержка нескольких версий API в колбе
  • 2 Solutions collect form web for “Остановка функции третьей стороны”

    В однопоточном сигнале, который не работает в Windows (т. Е. Любой вкус Unix), вы можете использовать для него signal.alarm.

    Проверьте первый пример в документации – это более или менее то, о чем вы просите: https://docs.python.org/2/library/signal.html

    Если кому-то это понадобится, это образец кода для работы (одно замечание: signal.signal можно вызывать только из основного потока):

     #!/usr/bin/python import time import signal import threading class MyException(Exception): pass class FooRunner(object): def goo(self, foo): try: signal.signal(signal.SIGALRM, self.on_stop_signal) foo() except MyException: print('caugt alarm exception') def on_stop_signal(self, *args): print('alarm triggered') raise MyException() def sample_foo(): time.sleep(30) def stop_it(): signal.alarm(3) print('alarm was set for 3 seconds') if __name__ == "__main__": print('starting') fr = FooRunner() t = threading.Thread(target=stop_it) t.start() fr.goo(sample_foo) с #!/usr/bin/python import time import signal import threading class MyException(Exception): pass class FooRunner(object): def goo(self, foo): try: signal.signal(signal.SIGALRM, self.on_stop_signal) foo() except MyException: print('caugt alarm exception') def on_stop_signal(self, *args): print('alarm triggered') raise MyException() def sample_foo(): time.sleep(30) def stop_it(): signal.alarm(3) print('alarm was set for 3 seconds') if __name__ == "__main__": print('starting') fr = FooRunner() t = threading.Thread(target=stop_it) t.start() fr.goo(sample_foo) 

    Спасибо @jsbueno

    Python - лучший язык программирования в мире.