Назад | Перейти на главную страницу

Ошибка блокировки потока фоновой задачи Python с помощью mod_wsgi

У меня есть небольшое веб-приложение на 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 исправил мои проблемы.