2010-05-09 8 views
11

Tengo un script en python que utiliza un recurso que no puede ser utilizado por más de una cierta cantidad de scripts simultáneos en ejecución.¿Semáforos con nombre en Python?

Clásicamente, esto sería resuelto por un nombre semáforos pero no puedo encontrarlos en la documentación del módulo multiprocessing o .

¿Echo de menos algo o me llamo semáforos no implementados/expuestos por Python? y más importante aún, si la respuesta es no, ¿cuál es la mejor manera de emular uno?

Gracias, Boaz

PS. Por razones que no son tan relevantes a esta pregunta, no puedo agregar la tarea a un proceso/daemon o el trabajo se ejecuta de forma continua con procesos generados - ambos de los cuales, al parecer, habría trabajado con la API de Python.

Respuesta

4

Sugiero una extensión de terceros como these, idealmente la posix_ipc, vea en particular la sección sempahore en los documentos.

Estos módulos tratan principalmente de exponer el "sistema V IPC" (incluidos los semáforos) de una manera unixy, pero al menos uno de ellos (posix_ipc específicamente) funciona con Cygwin en Windows (no he verificado que Reclamación). Hay algunos documentados limitations en FreeBSD 7.2 y Mac OSX 10.5, así que ten cuidado si esas plataformas son importantes para ti.

0

Puede emularlos utilizando el sistema de archivos en lugar de una ruta de kernel (los semáforos con nombre se implementan de esta manera en algunas plataformas de todos modos). Tendrá que implementar sem_[open|wait|post|unlink] usted mismo, pero debe ser relativamente trivial para hacerlo. Su cabeza sincronización puede ser significativo (dependiendo de la frecuencia con que tiene que jugar con el semáforo en su aplicación), así que sería bueno para inicializar un disco de memoria cuando se inicia el proceso en el que almacenar los semáforos con nombre.

Alternativamente, si no se siente cómodo rodando el suyo, probablemente podría envolver boost::interprocess::named_semaphore (docs here) en un módulo de extensión simple.

+2

Hay un montón de maneras de conseguir este mal (la equidad, la programación de activación, las condiciones de carrera). Use primitivas kernel o libc (por ejemplo, la API sem_ * real, o la API CreateSemaphore/event en Windows); evite rodar sus propias primitivas de sincronización. –

+1

Esta es la razón por la que le ofrezco que podría usar el impulso si no se siente cómodo rodando el suyo. –

Cuestiones relacionadas