Por que o método que usa o gevent em uma API do Flux implementada pelo mod_wsgi está levantando erro sobre a troca de threads?

1

Estou tentando implantar uma API Flask via Apache / mod_wsgi. A API usa o Gevent para fornecer simultaneidade para um método recursivo. No entanto, está jogando o seguinte erro

[Mon Feb 08 12:05:37 2016] [error] error: cannot switch to a different thread
[Mon Feb 08 12:05:37 2016] [error] <callback at 0x1094ee350 args=()> failed with error

A API inteira funciona bem usando o Gevent quando executada usando o servidor da Web integrado do Pycharm, e a API é executada corretamente usando o Apache / mod_wsgi quando não uso o gevent para fornecer a simultaneidade.

Eu suponho que isso deve ser executado no Apache, mas até agora não consegui encontrar uma solução. Eu continuo vendo menção de monkey patch, então eu adicionei esta linha ao módulo no qual gevent é chamado

from gevent import monkey; monkey.patch_all()

mas isso não parece ajudar.

Encontrei este bit em contêineres WSGI autônomos na documentação do Flask ( link ):

Gevent is a coroutine-based Python networking library that uses greenlet to provide a high-level synchronous API on top of libevent event loop:

from gevent.wsgi import WSGIServer
from yourapplication import app

http_server = WSGIServer(('', 5000), app)
http_server.serve_forever()

Também diz que

There are popular servers written in Python that contain WSGI applications and serve HTTP. These servers stand alone when they run; you can proxy to them from your web server. Note the section on Proxy Setups if you run into issues.

Eu preciso eliminar o uso de mod_wsgi e usar o servidor WSGI embutido do Gevent e, em seguida, procurá-lo via Apache? Isso seria um PITA real, especialmente para lidar com problemas de CORS (temos uma interface web que acessa a API no mesmo servidor, e o proxy de uma porta diferente causaria problemas de origem cruzada - a menos que alguém possa me convencer do contrário). / p>

Qualquer insight sobre o que tentar em seguida seria mais apreciado.

    
por horcle_buzz 08.02.2016 / 21:56

3 respostas

0

Encontrei a resposta aqui: Por que a diretiva WSGIApplicationGroup% {GLOBAL} funciona para criar novos tópicos

Em poucas palavras:

WSGIApplicationGroup: Set the execution to run under the same Python interpreter (the first created).

Portanto, por padrão, cada novo segmento não deve ter usado a mesma instância do interpretador python.

Para o uWSGI, o método equivalente é adicioná-lo ao seu arquivo .ini:

single-interpreter = true
    
por 18.08.2016 / 20:21
2

o apache mod_wsgi não é compatível com o gevent. Para o AWST elástico com o Apache, usei async_mode="threading" para o Flask e ele funciona bem. Note que o threading tem menos desempenho que o gevent. link

app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="threading") 

Observe que o Flask pode ser executado sozinho com gevent.

app = Flask(__name__,static_folder='static')
socketio = SocketIO(app, async_mode="gevent") 

if __name__ == '__main__':
    HOST = '127.0.0.1'
    PORT = 5055
    socketio.run(app, port=PORT, host=HOST)

No entanto, você realmente quer um servidor HTTP na frente dele, como o Gunicorn.

    
por 20.08.2017 / 23:35
0

Acabei de encontrar um tópico semelhante ao meu aqui link que tem a solução.

Para fazer o que eu preciso, eu tenho que adicionar a diretiva WSGIApplicationGroup %{GLOBAL} ao meu conf Apache. Eu também estou curioso para saber por que isso resolve o problema.

    
por 08.02.2016 / 22:14