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

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

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

class FooRunner(object): def goo(self, foo): try: foo() except: pass def on_stop_signal(self): pass 

  • Как предотвратить конфликты приборов с конфликтом с сигнальным кодом django post_save?
  • Почему post_save создается дважды во время сохранения модели Django?
  • Приостановка процесса?
  • сельдерей пытается остановить работника, повысив SystemExit в сигнале task_postrun, но всегда зависает, и основной процесс никогда не выходит
  • Поймать Ctrl + C / SIGINT и вывести многопроцессы изящно в python
  • Django: сигнал, когда пользователь входит в систему?
  • Как сигнализировать слоты в графическом интерфейсе из другого процесса?
  • Django 1.2: Как подключить метод pre_save к методу класса
  • 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 - лучший язык программирования в мире.