Também encontrei isso e descobri o motivo e corrijo.
A razão pela qual isso acontece é que o plugin python uwsgi (ou mais provavelmente todos os plugins uwsgi) fork () new workers depois que o aplicativo é carregado no pai. Como resultado, os filhos herdam todos os recursos (incluindo descritores de arquivos como a conexão db) do pai.
Você pode ler sobre isso brevemente no wiki uwsgi :
uWSGI tries to abuse fork() copy on write whenever possible. By default it will fork after having loaded your applications. If you do not want that behaviour use the --lazy option. Enabling it, will instruct uWSGI to load the applications after each worker's fork()
E, como você deve saber, as conexões e os cursores do mysqldb do Python não são thread-safe, a menos que você os proteja explicitamente. Portanto, vários processos (como os operadores uwsgi) usando a mesma conexão / cursor mysql concorrentemente o corromperão.
No meu caso (para a API King Arthur's Gold ), isso funcionou bem quando criei a conexão MySQL por solicitação no escopo de outro módulo, mas quando eu queria conexões persistentes para ajudar com o desempenho, movi a conexão com o banco de dados e o cursor para o escopo global no módulo pai. Como resultado, minhas conexões estavam pisando uma na outra como a sua.
A correção para isso é adicionar a palavra-chave "lazy" (ou opção de linha de comando --lazy) à sua configuração do uwsgi. Como resultado, o aplicativo será bifurcado novamente para cada filho em vez de bifurcar-se do pai e compartilhar a conexão (e avançar em algum ponto, de forma que o servidor MySQL force o fechamento devido a um pedido corrompido em algum momento).
Finalmente, se você quiser uma maneira de fazer isso sem modificar sua configuração do uwsgi, você provavelmente poderá usar o @postfork decorator para criar adequadamente uma nova conexão de banco de dados imediatamente após um processo de trabalho ser bifurcado. Você pode ler sobre isso aqui .Eu vejo do seu follow-up que você já mudou para pgsql, mas aqui está a resposta para que você possa dormir melhor à noite e para qualquer pessoa como você e eu tentando encontrar a resposta para isso!
P.S. Uma vez que eu tive uma compreensão do problema (o cursor sendo corrompido devido a que os funcionários pisavam um no outro), mas não percebi o pouco sobre fork () e --lazy, eu estava pensando em implementar meu próprio pool onde os trabalhadores "verificariam" out "uma conexão mysql de um pool no escopo global, então" volte a verificar "logo antes de sair do application (), entretanto é muito melhor usar --lazy a menos que a carga da sua aplicação varie o suficiente para que você esteja constantemente criando novos trabalhadores. Mesmo assim, talvez prefira --lazy, porque é significativamente mais limpo do que implementar seu próprio pool de conexões de banco de dados.
edit: aqui está um artigo mais completo sobre este problema + solução, pois há uma escassez de informações sobre ele para outros que o encontraram: link