Eu tenho um aplicativo django que processa um pouco uma foto quando ela é carregada. Esse processamento leva cerca de 100 ms.
Estou usando o Django rodando com gunicorn atrás do nginx.
Atualmente isso é feito de forma síncrona, eu uso subprocess
para invocar o processamento, obtenha o resultado e retorne o resultado dentro do quadro da solicitação HTTP.
O problema é que, embora o processamento real demore apenas ~ 100 ms, a exibição às vezes leva muitos segundos para retornar, causando o travamento dos threads de trabalho do gunicorn com mensagens como:
2012-12-18 15:01:04 [31620] [CRITICAL] WORKER TIMEOUT (pid:31626)
2012-12-18 15:01:05 [31620] [CRITICAL] WORKER TIMEOUT (pid:31626)
2012-12-18 15:01:05 [31957] [INFO] Booting worker with pid: 31957
(O nível do log é DEBUG
, e não recebo mais saída). Às vezes, leva todo o servidor da web para baixo.
Existe alguma maneira de mitigar esse problema? Atualmente, o tráfego não é alto o suficiente para considerar colocar o processamento em uma fila e se comunicar de forma assíncrona (e mesmo assim, queremos bloquear e ainda retornar no contexto da solicitação HTTP).
Alguém pode dar uma ideia de onde pode estar o problema?
Respostas:
0 para resposta № 1Eu consertei isso usando eventlet tópicos.
0 para resposta № 2
Para rotinas demoradas, a execução assíncrona é uma boa solução. o Aipo biblioteca é adequada para esse tipo de trabalho. E tem um nível de entrada relativamente baixo.