Python APScheduler 异常管理

标签 python python-3.x exception apscheduler

我在脚本中使用模块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/

相关文章:

python - 子集的确切数量

java - 根据条件创建文件

c++ - 当跨构造函数边界抛出异常时,borland C++ 编译器不会撤消内存分配?

java - 如何验证私有(private)方法的输入?

python - Python中输出json txt名称

python - 机器学习回归模型为每个图像预测相同的值

python - 如何用字符串训练机器学习?

python - 返回列表,其中元素依次从列表中获取/python

mysql - 如何捕获由于 mysql 数据中无效的连续字节而导致的 UnicodeDecodeError

Python:DataError - 字符串或二进制数据将被截断