Sémaphores en Python nommé?
-
04-10-2019 - |
Question
J'ai un script en python qui utilise une ressource qui ne peut pas être utilisé par plus d'un certain nombre de scripts simultanés en cours d'exécution.
Classiquement, ce serait résolu par un sémaphores nommé, mais je ne peux pas trouver ceux dans la documentation de multitraitement module ou filetage .
Suis-je manque quelque chose ou sont nommés sémaphores pas mis en œuvre / exposés par Python? et surtout, si la réponse est non, quelle est la meilleure façon d'imiter un?
Merci, Boaz
PS. Pour des raisons qui ne sont pas pertinentes à cette question, je ne peux pas agréger la tâche à un processus en cours d'exécution en continu / démon ou de travail avec les processus donné naissance - qui sont tous deux, il semble, aurait travaillé avec l'API python.
La solution
Je suggère une extension tierce partie comme ces , idéalement la posix_ipc
un - voir en particulier la section sémaphore dans la documentation.
Ces modules sont pour la plupart d'exposer le « 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 prétendu travail avec Cygwin sous Windows (je ne suis pas vérifié que la revendication ). Il y a quelques limitations sur FreeBSD 7.2 et Mac OS X 10.5, prenez donc soin si ces plates-formes sont importantes pour vous.
Autres conseils
Vous pouvez les imiter en utilisant le système de fichiers au lieu d'un chemin du noyau (sémaphores nommés sont mis en œuvre ainsi sur certaines plates-formes de toute façon). Vous devrez mettre en œuvre vous sem_[open|wait|post|unlink]
, mais il devrait être relativement trivial de le faire. Votre tête de synchronisation peut être importante (selon la fréquence que vous avez à jouer avec le sémaphores dans votre application), de sorte que vous pouvez initialiser un disque virtuel lorsque vous lancez votre processus dans lequel stocker les sémaphores nommés.
Alternativement, si vous n'êtes pas à l'aise rouler vos propres, vous pourriez probablement envelopper boost::interprocess::named_semaphore
( docs ) dans un module d'extension simple.