У меня есть небольшое веб-приложение на Python, построенное на платформе Flask и развернутое с помощью 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.
Оказывается, проблема не связана с apscheduler или Flask. Трудно сказать, в чем была точная причина, но сборка python из исходного кода с --enable-shared
и скачивание последней mod_wsgi
от pypi исправил мои проблемы.