我在脚本中使用模块APScheduler
,我使用BlockingScheduler
。我有一些定期的工作。如果此作业引发
一个异常
,无论我在try
中期望
它还是让它传播,我的线程都会这样做不返回。然后我达到 max_instance
并且不再执行任何作业。
使用 BlockingScheduler
时,我应该如何管理线程中的异常
?
这是我的 MWE,它说明了我的问题:
from apscheduler.schedulers.blocking import BlockingScheduler
import threading
class x:
def __init__(self):
self._lock = threading.Lock()
def __enter__(self):
print("ENTER")
self._lock.acquire()
print("LOCK")
raise Exception("ERROR")
return self
def __exit__(self, exc_type, exc_val, exc_tb):
print("EXIT")
self._lock.release()
print("UNLOCK")
a = x()
def test():
print("TEST")
with a:
print("WITH")
pollingScheduler = BlockingScheduler()
pollingScheduler.add_job(test, 'interval', seconds=1, max_instances=1)
pollingScheduler.start()
我预计在引发异常时必须调用 __exit__()
方法,即使是 __enter__()
引发异常。在睾丸之后,我看到在这种情况下没有调用 __exit__()
。因此它会导致死锁并且线程卡住。
我该如何解决这个问题?
看起来 __enter__()
不能引发异常。是吗?
最佳答案
这里的问题是,仅当__enter__
成功完成时才会调用__exit__
。由于您在 __enter__ 中引发异常,因此锁处于已获取状态,因此在尝试获取锁时作业的后续运行将挂起。如果您预计 __enter__
中出现异常,请将其包装在 try... except
block 中,如果引发异常,该 block 将释放锁。
关于Python APScheduler 异常管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34773749/