如何在Python中停止函数中间运行
我有很多次不得不在运行过程中停止一个函数,而无法访问它,或者它有数百行代码,如果每行都进行if检查是不可行的,或者它以某种方式被删除。代码本身可以触发一个事件 我使用了如何在Python中停止函数中间运行,python,Python,我有很多次不得不在运行过程中停止一个函数,而无法访问它,或者它有数百行代码,如果每行都进行if检查是不可行的,或者它以某种方式被删除。代码本身可以触发一个事件 我使用了sys.settrace来完成任务,如以下MWE: from threading import Event, Thread import sys import time _stop = Event() def _globaltrace(frame, event, arg): """The global trace c
sys.settrace
来完成任务,如以下MWE:
from threading import Event, Thread
import sys
import time
_stop = Event()
def _globaltrace(frame, event, arg):
"""The global trace call handler."""
if event == 'call':
return _localtrace
else:
return None
def _localtrace(frame, event, arg):
"""The local trace call handler."""
global _stop
if _stop.is_set():
if event == 'line':
raise Exception()
return _localtrace
if __name__ == "__main__":
def long_function():
# The Function that need to be terminated before it ends.
# That we _CAN'T_ change anything in.
print("Long Function Started.")
while True:
time.sleep(1)
def simulate_external_input_callback():
global _stop
time.sleep(5)
print("Kill signal received.")
_stop.set()
sys.settrace(_globaltrace)
th = Thread(target=simulate_external_input_callback)
th.start()
try:
long_function()
except Exception:
print("Long Function Killed.")
# Try to do some cleanup.
else:
print("Long function ended normally.")
print("The program continues, like nothing happened.")
th.join() # Just here for clean up.
然后绑定一个something来设置事件:\u stop.set()
,在需要时,通过回调或计时器进行设置,并尝试捕获它
但这是一个令人讨厌的黑客行为,正如人们所说,它通常是不必要的。我相信他们,我不能再去想另一个解决方案了
因此,我希望有人知道“正确”的解决方案,其中没有使用
sys.settrace
,来终止long_函数
,您能给出一个更具体的例子说明您希望做什么吗?现在,理解你想要问的是一个非常具有挑战性的问题。我将尝试提出一个适合页面的问题。希望更新能更清楚地说明我想要实现的目标。