使用mod_wsgi的Python后台任务线程锁错误

使用mod_wsgi的Python后台任务线程锁错误

我有一个基于 Flask 框架构建的小型 Python Web 应用程序,并使用 mod_wsgi 部署到 apache。该应用程序正在使用以下代码安排后台任务:调度器每隔几分钟运行一次。

从apache的错误日志中我一直观察到一个错误。错误似乎是在后台任务运行时抛出的,但它并不一致,前后不一致,而且经常是接连多次出现。

错误如下:

Exception ignored in: <module 'threading' from '/usr/local/lib/python3.4/threading.py'>
Traceback (most recent call last):
  File "/usr/local/lib/python3.4/threading.py", line 1289, in _shutdown
    assert tlock is not None
AssertionError:

该位置的代码来自 python 本身,如下所示:

def _shutdown():
    # Obscure:  other threads may be waiting to join _main_thread.  That's
    # dubious, but some code does it.  We can't wait for C code to release
    # the main thread's tstate_lock - that won't happen until the interpreter
    # is nearly dead.  So we release it here.  Note that just calling _stop()
    # isn't enough:  other threads may already be waiting on _tstate_lock.
    tlock = _main_thread._tstate_lock
    # The main thread isn't finished yet, so its thread state lock can't have
    # been released.
    assert tlock is not None
    assert tlock.locked()
    tlock.release()

我对多线程或 Python 源代码都没有足够的经验,无法理解这一点,但似乎主线程的锁未设置,或者已被某些东西取消设置。因为我没有在本地遇到此错误,所以我怀疑这是 mod_wsgi 或 apache 的问题。堆栈跟踪不包含除导致错误的行之外的任何元素,尽管我不知道它是什么意思,但我觉得这很奇怪。

我没有遇到此错误的任何副作用,如果我没有查看日志,我可能不会注意到它的存在。在将应用程序部署到正在运行的生产服务器之前,我从未见过它Ubuntu 14.04.1 LTS。这是来自 apache 的版本字符串:

Apache/2.4.7 (Ubuntu) PHP/5.5.9-1ubuntu4.4 mod_wsgi/3.4 Python/3.4.0

我希望有人能理解这一点并帮助我摆脱它。

编辑:

我现在已经将后台任务从应用程序中分离出来,但仍然遇到错误,所以这似乎是 mod_wsgi 或 Flask 中的一个问题。

答案1

事实证明,问题与 apscheduler 或 Flask 无关。很难说出确切的原因是什么,但使用源代码构建 python--enable-sharedmod_wsgi从 pypi 下载最新版本解决了我的问题。

相关内容