Erro de bloqueio de encadeamento de tarefa em segundo plano em Python com mod_wsgi

3

Eu tenho um pequeno aplicativo web python construído no framework Flask e implantado com o mod_wsgi no apache. O aplicativo está agendando uma tarefa em segundo plano com o apscheduler que é executado a cada dois minutos.

No log de erros do apache, tenho observado um erro. O erro parece ser lançado na hora em que a tarefa em segundo plano está sendo executada, mas não é consistente ser antes ou depois e, muitas vezes, ocorre várias vezes uma após a outra.

Aqui está o erro:

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:

O código nesse local, que é do próprio python, é o seguinte:

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()

Eu não tenho experiência suficiente em multi-threading ou no código-fonte Python para fazer muito sentido, mas parece que o bloqueio para o thread principal não está definido, ou que ele não foi configurado por algo. Como não encontrei esse erro localmente, suspeito que algo seja mod_wsgi ou apache. O rastreamento de pilha não contém nenhum elemento além da linha que causa o erro, o que eu acho estranho, embora não consiga descobrir o que isso significa.

Eu não experimentei nenhum efeito colateral desse erro, e provavelmente não teria notado que existia se eu não tivesse olhado nos logs. Eu nunca vi antes de implantar meu aplicativo no servidor de produção, que está executando Ubuntu 14.04.1 LTS . Aqui está a string de versão do apache:

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

Espero que alguém possa entender isso e me ajudar a me livrar disso.

EDITAR:

Eu já considerei a tarefa de segundo plano do aplicativo, mas ainda estou tendo o erro, então isso parece um problema no mod_wsgi ou no Flask.

    
por totokaka 29.12.2014 / 19:23

1 resposta

1

Acontece que o problema não está relacionado ao apscheduler ou Flask. É difícil dizer qual foi a causa exata, mas construir o python a partir do código-fonte com --enable-shared e fazer o download do último mod_wsgi do pypi corrigiu meus problemas.

    
por 29.12.2014 / 20:34