2012-08-07 13 views
6

Necesito sincronizar hilos y procesos de python (no necesariamente relacionados entre sí) con un bloqueo con nombre (bloqueo de archivos, por ejemplo). Preferiblemente debería ser un bloqueo para lectores y escritores. He tratado fcntl.flock (que tiene tanto exclusivo y adquisición de bloqueo compartido) pero no proporciona el nivel deseado de bloqueo - Does python's fcntl.flock function provide thread level locking of file access?Bloqueo con nombre compartido y exclusivo para python

Mi solución hasta ahora es utilizar lockfile con memcached (o archivo bloqueado mmap'ed). Lockfile sincronizará el acceso y Memcached contará lectores/escritores.

¿Hay alguna solución mejor/más rápida? ¿Conoces algún proyecto que ya resuelva este problema?

+0

Estaría interesado en cualquier solución también. – cji

+0

Pruebe la biblioteca [ilock] (https://github.com/symonsoft/ilock) – Symon

Respuesta

2

Aquí hay un enlace http://semanchuk.com/philip/ con bibliotecas que implementan los semáforos posix y del sistema V. Puedes usar uno de esos. Sin embargo, ten cuidado con eso en una situación en la que el proceso que contiene el semáforo muere sin soltarlo; todos los demás quedan atrapados. Si tienes miedo de esto, puedes usar semáforos System V con UNDO, pero son un poco más lentos. Además, si utiliza primitivas de memoria compartida de System V, recuerde que viven en kernel y continúan viviendo después de la finalización del proceso, debe eliminarlas explícitamente del sistema.

Si usted no tiene miedo de los procesos y estancamiento de todo el sistema y los procesos de la muerte están relacionadas - (. Que son POSIX nombrados semáforos) se podría usar semáforos del pitón

La página se ha vinculado como cuestión conexa (fcntl) hace sin decir que fcntl no es adecuado para el bloqueo entre hilos. Está diciendo que fcntl se preocupa por fds. Por lo tanto, puede usar fcntl para el bloqueo entre procesos y entre hilos siempre que abra el archivo bloqueado y obtenga un nuevo fd para cada instancia de bloqueo.

También podría usar una combinación de fcntl para el semáforo entre procesos y python para el bloqueo entre hilos.

Y finalmente: reconsidere su arquitectura. El bloqueo generalmente es malo. Delegue el recurso a un proceso que se encargará de él sin bloquearlo. Será mucho más simple de mantener. Créame.

Cuestiones relacionadas