Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Python e Redis:práticas recomendadas do aplicativo Manager/Worker


Seu problema é que você está tentando executar vários comandos simultaneamente com uma única conexão redis.

Você está esperando algo como
Thread 1     Thread 2
LLEN test    
1                            
LPOP test   
command      
             LLEN test
             0

mas você está conseguindo
Thread 1     Thread 2
LLEN test    
1                            
LPOP test   
             LLEN test
             command
0

Os resultados voltam na mesma ordem, mas não há nada ligando um encadeamento ou comando a um resultado específico. Conexões redis individuais não são thread-safe - você precisará de uma para cada thread de trabalho.

Você também pode ver problemas semelhantes se usar o pipeline de forma inadequada - ele foi projetado para cenários somente de gravação, como adicionar muitos itens a uma lista, onde você pode melhorar o desempenho assumindo que o LPUSH foi bem-sucedido em vez de esperar que o servidor diga que foi bem-sucedido após cada item. O Redis ainda retornará os resultados, mas eles não serão necessariamente resultados do último comando enviado.

Fora isso, a abordagem básica é razoável. Existem algumas melhorias que você pode fazer:
  • Em vez de verificar o comprimento, use apenas LPOP sem bloqueio - se retornar nulo, a lista está vazia
  • Adicione um cronômetro para que, se a lista estiver vazia, ela aguarde em vez de apenas emitir outro comando.
  • Incluir uma verificação de cancelamento na condição do loop while
  • Lidar com erros de conexão - eu uso um loop externo configurado para que, se a conexão falhar, o trabalhador tente se reconectar (basicamente reinicie main ) por um número razoável de tentativas antes de encerrar completamente o processo de trabalho.