2010-05-09 16 views
11

J'ai un script en python qui utilise une ressource qui ne peut pas être utilisée par plus d'un certain nombre de scripts simultanés en cours d'exécution.Sémaphores nommés en Python?

Classiquement, cela serait résolu par un sémaphore nommé mais je ne le trouve pas dans la documentation du module multiprocessing ou threading.

Ai-je manqué quelque chose ou sont nommés sémaphores non implémentés/exposés par Python? et plus important encore, si la réponse est non, quelle est la meilleure façon d'en imiter une?

Merci, Boaz

PS. Pour des raisons qui ne sont pas si pertinentes à cette question, je ne peux pas agréger la tâche à un processus/daemon en cours d'exécution ou travailler avec des processus générés - qui, semble-t-il, auraient fonctionné avec l'API python.

Répondre

4

Je suggère une extension de tiers comme these, idéalement le posix_ipc - voir en particulier la section sempahore dans les docs. Ces modules sont principalement sur l'exposition du "système V IPC" (y compris les sémaphores) d'une manière unixy, mais au moins l'un d'entre eux (posix_ipc spécifiquement) est censé fonctionner avec Cygwin sur Windows (je ne ai pas vérifié que prétendre). Sur FreeBSD 7.2 et Mac OSX 10.5, il y a quelques exemples documentés de limitations, alors faites attention si ces plateformes sont importantes pour vous.

0

Vous pouvez les émuler en utilisant le système de fichiers au lieu d'un chemin de noyau (les sémaphores nommés sont implémentés de cette façon sur certaines plates-formes de toute façon). Vous devrez mettre en œuvre sem_[open|wait|post|unlink] vous-même, mais il devrait être relativement trivial de le faire. Votre temps de synchronisation peut être important (en fonction de la fréquence à laquelle vous devez manipuler le sémaphore dans votre application). Vous pouvez donc vouloir initialiser un disque virtuel lorsque vous lancez votre processus de stockage des sémaphores nommés.

Alternativement, si vous n'êtes pas à l'aise en roulant le vôtre, vous pouvez probablement envelopper boost::interprocess::named_semaphore (docs here) dans un simple module d'extension.

+2

Il y a plusieurs façons de se tromper (équité, planification du réveil, conditions de course). Utilisez les primitives noyau ou libc (par exemple, l'API real sem_ * ou l'API CreateSemaphore/event dans Windows); évitez de rouler vos propres primitives de synchronisation. –

+1

C'est pourquoi j'offre que vous pouvez utiliser boost si vous n'êtes pas à l'aise de rouler les vôtres. –