Su problema es que está intentando ejecutar varios comandos al mismo tiempo con una sola conexión redis.
Estás esperando algo como
Thread 1 Thread 2
LLEN test
1
LPOP test
command
LLEN test
0
pero estás recibiendo
Thread 1 Thread 2
LLEN test
1
LPOP test
LLEN test
command
0
Los resultados regresan en el mismo orden, pero no hay nada que vincule un hilo o comando a un resultado específico. Las conexiones redis individuales no son seguras para subprocesos:necesitará una para cada subproceso de trabajo.
También puede ver problemas similares si usa la canalización de manera inapropiada:está diseñado para escenarios de solo escritura, como agregar muchos elementos a una lista, donde puede mejorar el rendimiento asumiendo que LPUSH tuvo éxito en lugar de esperar a que el servidor le diga que tuvo éxito después de cada uno. ít. Redis aún devolverá los resultados, pero no necesariamente serán los resultados del último comando enviado.
Aparte de eso, el enfoque básico es razonable. Sin embargo, hay un par de mejoras que podrías hacer:
- En lugar de verificar la longitud, simplemente use LPOP sin bloqueo; si devuelve nulo, la lista está vacía
- Agregue un temporizador para que, si la lista está vacía, espere en lugar de simplemente emitir otro comando.
- Incluya una verificación de cancelación en la condición del ciclo while
- Manejar errores de conexión:utilizo una configuración de bucle externo para que, si falla la conexión, el trabajador intente volver a conectarse (básicamente reinicie main ) durante un número razonable de intentos antes de finalizar el proceso de trabajo por completo.