2008-10-17 14 views
9

He implementado un servidor web python. Cada solicitud http genera un nuevo hilo. Tengo el requisito de almacenar en memoria caché los objetos y, dado que es un servidor web, quiero que la memoria caché sea segura para la ejecución de subprocesos. ¿Hay una implementación estándar de un caché de objetos seguro para subprocesos en python? He encontrado el siguientepython threadsafe object cache

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!

Respuesta

8

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.

Así que para cortar una larga historia corta ...

Si usted tiene requisitos bastante simples y no se preocupan de la ordenación de lo que se escriben en la memoria caché, puede utilizar un diccionario y saber que Siempre obtendrá un valor consistente/no corrompido (puede que esté desactualizado).

Si desea asegurarse de que las cosas son un poco más consistente con respecto a la lectura y la escritura entonces es posible que desee ver en caché de la memoria local de Django:

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

que utiliza un bloqueo de lectura/escritura para bloquear

4

Probablemente desee utilizar memcached en su lugar. Es muy rápido, muy estable, muy popular, tiene buenas bibliotecas de Python, y le permitirá crecer a una memoria caché distribuida caso de que necesite:

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

9

subproceso por petición 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.

2

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

from threading import local 

safe = local() 

safe.cache = {} 

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

+2

Debe señalar que un caché local de subprocesos no compartirá objetos a través de subprocesos. –