![使用mod_wsgi的Python后台任务线程锁错误](https://linux22.com/image/648709/%E4%BD%BF%E7%94%A8mod_wsgi%E7%9A%84Python%E5%90%8E%E5%8F%B0%E4%BB%BB%E5%8A%A1%E7%BA%BF%E7%A8%8B%E9%94%81%E9%94%99%E8%AF%AF.png)
我有一个基于 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-shared
并mod_wsgi
从 pypi 下载最新版本解决了我的问题。