threads thread parallel python multithreading caching

thread - caché de objetos enhebra python



python process (4)

Implementé un servidor web python. Cada solicitud http genera un nuevo hilo. Tengo un requisito de almacenar en caché los objetos en la memoria y, dado que es un servidor web, quiero que la memoria caché sea segura para los hilos. ¿Hay una implementación estándar de un caché de objetos seguro para subprocesos en python? Encontré lo siguiente

http://freshmeat.net/projects/lrucache/

Esto no parece ser seguro para subprocesos. ¿Alguien puede indicarme una buena implementación de caché seguro para subprocesos en Python?

¡Gracias!


El hilo por solicitud es a menudo una mala idea. Si tu servidor experimenta grandes picos en la carga, la caja se pondrá de rodillas. Considere usar un grupo de subprocesos que pueda crecer hasta un tamaño limitado durante el uso pico y reducir a un tamaño más pequeño cuando la carga sea ligera.


Probablemente quieras usar memcached en su lugar. Es muy rápido, muy estable, muy popular, tiene buenas bibliotecas de Python, y le permitirá crecer a un caché distribuido si lo necesita:

http://www.danga.com/memcached/


Bueno, muchas operaciones en Python son seguras para hilos por defecto, por lo que un diccionario estándar debería estar bien (al menos en ciertos aspectos). Esto se debe principalmente al GIL, lo que ayudará a evitar algunos de los problemas de enhebrado más serios.

Hay una lista aquí: http://coreygoldberg.blogspot.com/2008/09/python-thread-synchronization-and.html que podría ser útil.

Aunque la naturaleza atómica de esas operaciones solo significa que no tendrá un estado totalmente inconsistente si tiene dos hilos que acceden a un diccionario al mismo tiempo. Entonces no tendrías un valor corrupto. Sin embargo, usted (como con la mayoría de los programas de multi-threading) no podrá confiar en el orden específico de esas operaciones atómicas.

Entonces, para abreviar una larga historia ...

Si tiene requisitos bastante simples y no le molesta el orden de lo que se escribe en el caché, puede usar un diccionario y saber que siempre obtendrá un valor consistente / no corrompido (podría estar fuera de fecha).

Si quiere asegurarse de que las cosas son un poco más consistentes con respecto a la lectura y la escritura, entonces puede que quiera mirar la memoria caché local de Django:

http://code.djangoproject.com/browser/django/trunk/django/core/cache/backends/locmem.py

Que usa un bloqueo de lectura / escritura para bloquear.


Para un objeto seguro para hilos que desee threading.local:

from threading import local safe = local() safe.cache = {}

A continuación, puede colocar y recuperar objetos en safe.cache con seguridad de hilos.