Estou começando a brincar com o Flask em um servidor local e estou percebendo que os tempos de solicitação / resposta estão mais lentos do que acho que deveriam ser.
Apenas um servidor simples como o seguinte leva cerca de 5 segundos para responder.
from flask import Flask
app = Flask(__name__)
@app.route("/")
def index():
return "index"
if __name__ == "__main__":
app.run()
Alguma ideia? Ou é apenas assim que o servidor local é?
Respostas:
Ok, eu descobri. Parece ser um problema com o Werkzeug e os sistemas operacionais que oferecem suporte ao ipv6.
Do site Werkzeug http://werkzeug.pocoo.org/docs/serving/ :
Portanto, a correção é desativar o ipv6 do localhost comentando a seguinte linha do meu arquivo hosts:
::1 localhost
Depois de fazer isso, os problemas de latência desaparecem.
Estou realmente curtindo o Flask e fico feliz que não seja um problema com o framework. Eu sabia que não poderia ser.
fonte
Adicione "threaded = True" como um argumento para app.run (), conforme sugerido aqui: http://arusahni.net/blog/2013/10/flask-multithreading.html
Por exemplo:
app.run(host="0.0.0.0", port=8080, threaded=True)
A solução de desativação de ipv6 não funcionou para mim, mas funcionou.
fonte
--threaded
para o meumanage.py
usoFlask-Script
também funcionou.flask run --with-threads
que resolveu meu problema.A solução de @ sajid-siddiqi é tecnicamente correta, mas tenha em mente que o servidor WSGI embutido em Werkzeug (que é empacotado no Flask e para o que ele serve
app.run()
) é apenas de thread único.Instale um servidor WSGI para poder lidar com o comportamento multithread. Fiz muitas pesquisas sobre vários desempenhos de servidores WSGI . Suas necessidades podem variar, mas se tudo o que você está usando é o Flask , eu recomendaria um dos seguintes servidores da web.
Atualização (2020-07-25): Parece que o gevent começou a oferecer suporte ao python3 5 anos atrás, logo depois que comentei que não, então você pode usar o gevent agora.
gevent
Você pode instalar gevent por meio de pip com o comando
pip install gevent
ou pip3 com o comandopip3 install gevent
. As instruções sobre como modificar seu código de acordo estão aqui: https://flask.palletsprojects.com/en/1.1.x/deploying/wsgi-standalone/#geventMeinheld
gevent é melhor, mas de todos os benchmarks que observei que envolvem testes do mundo real, meinheld parece ser o servidor WSGI mais direto e simplista . (Você também pode dar uma olhada no uWSGI se não se importar com mais configurações.)
Você também pode instalar o meinheld por meio do pip3 com o comando
pip3 install meinheld
. A partir daí, observe o exemplo fornecido na fonte meinheld para integrar o Flask : https://github.com/mopemope/meinheld/blob/master/example/flask_sample.py* NOTA: Do meu uso do PyCharm , a linha é
from meinheld import server
destacada como um erro, mas o servidor será executado, portanto, você pode ignorar o erro.fonte
Em vez de ligar para
http://localhost:port/endpoint
ligarhttp://127.0.0.1:port/endpoint
. Isso removeu o atraso inicial de 500 ms para mim.fonte
Meu problema foi resolvido por "threaded = True", mas quero fornecer algumas informações básicas para distinguir meu problema de outros para os quais isso pode não funcionar.
Meu melhor palpite é que o Chrome estava tentando manter a sessão aberta e o Flask estava bloqueando as solicitações subsequentes. Assim que a conexão do Chrome foi interrompida ou redefinida, todo o resto foi processado.
No meu caso, o threading corrigiu isso. Claro, agora estou percorrendo alguns dos links que outras pessoas forneceram para ter certeza de que isso não causará nenhum outro problema.
fonte
threaded=True
funciona para mim, mas finalmente descobri que o problema é devido ao foxyproxy no firefox. Desde quando o aplicativo Flask está em execução no host local, a resposta lenta acontece seresposta lenta não acontecerá se
foxyproxy está desabilitado no firefox
acesse o site usando outros navegadores
A única solução que encontrei foi desabilitar o foxyproxy, tentei adicionar localhost à lista negra de proxy e ajustar as configurações, mas nada funcionou.
fonte
Usei a resposta de Miheko para resolver meu problema.
::1 localhost
já estava comentado no meu arquivo hosts e a configuraçãoThreaded=true
não funcionou para mim. Cada solicitação REST demorava 1 segundo para ser processada em vez de ser instantânea.Estou usando o python 3.6 e consegui que o flask fosse rápido e responsivo às solicitações REST, fazendo com que o flask usasse gevent como seu WSGI.
Para usar gevent, instale-o com
pip install gevent
Depois, usei https://gist.github.com/viksit/b6733fe1afdf5bb84a40#file-async_flask-py-L41 para definir o frasco para usar gevent.
Caso o link caia, aqui estão as partes importantes do script:
from flask import Flask, Response from gevent.pywsgi import WSGIServer from gevent import monkey # need to patch sockets to make requests async # you may also need to call this before importing other packages that setup ssl monkey.patch_all() app = Flask(__name__) # define some REST endpoints... def main(): # use gevent WSGI server instead of the Flask # instead of 5000, you can define whatever port you want. http = WSGIServer(('', 5000), app.wsgi_app) # Serve your application http.serve_forever() if __name__ == '__main__': main()
fonte
Recebi este erro ao executar em hosts diferentes de
localhost
também, portanto, para alguns, diferentes problemas subjacentes podem exibir os mesmos sintomas.Troquei a maioria das coisas que tenho usado para Tornado e, de forma anedótica, ajudou bastante. Tive alguns carregamentos de página lentos, mas as coisas geralmente parecem mais responsivas. Além disso, muito anedótico, mas pareço notar que Flask sozinho vai ficar lento com o tempo, mas Flask + Tornado menos. Eu imagino usar o Apache e
mod_wsgi
tornaria as coisas ainda melhores, mas o Tornado é realmente simples de configurar (veja http://flask.pocoo.org/docs/deploying/others/ ).(Além disso, uma pergunta relacionada: Flask app ocasionalmente travando )
fonte
Eu tive uma solução diferente aqui. Acabei de deletar tudo
.pyc
do diretório do servidor e iniciei novamente. A propósito, localhost já foi comentado no meu arquivo hosts (Windows 8).O servidor estava travando o tempo todo e agora está funcionando bem novamente.
fonte