Mutex à L'échelle du système en Python sur Linux

y a-t-il un moyen facile d'avoir un mutex à l'échelle du système en Python sous Linux? Par "System-wide", je veux dire que le mutex sera utilisé par un groupe de Python ; ceci est en contraste avec un mutex traditionnel, qui est utilisé par un groupe de threads dans le même processus.

EDIT: Je ne suis pas sûr que Python soit multiprocessing package est ce dont j'ai besoin. Par exemple, je peux exécuter les opérations suivantes dans deux différents interprètes:

from multiprocessing import Lock
L = Lock()
L.acquire()

Lorsque I exécutez ces commandes simultanément en deux interprètes séparés, je veux que l'un d'eux soit suspendu. Au lieu de cela, ni l'un ni l'autre ne pend; il semble qu'ils n'acquièrent pas le même mutex.

42
demandé sur Martin Thoma 2011-08-03 22:27:21

4 réponses

la réponse "traditionnelle" D'Unix est d'utiliser des serrures de fichier. Vous pouvez utiliser lockf(3) pour verrouiller des sections d'un fichier afin que les autres processus ne puissent pas l'éditer; un abus très courant est de l'utiliser comme mutex entre les processus. L'équivalent python est fcntl.lockf.

traditionnellement vous écrivez le PID du processus de verrouillage dans le fichier de verrouillage, de sorte que les blocages dus à la mort des processus tout en maintenant la serrure sont identifiables et réparables.

Vous obtenez ce que vous want, puisque votre lock est dans un namespace global (le système de fichiers) et accessible à tous les processus. Cette approche a aussi l'avantage que les programmes non-Python peuvent participer à votre verrouillage. L'inconvénient est que vous avez besoin d'un endroit pour ce fichier lock pour vivre; en outre, certains systèmes de fichiers ne se verrouillent pas correctement, il y a donc un risque qu'il ne parvienne pas silencieusement à l'exclusion. Vous en gagnez, vous en perdez.

24
répondu zmccord 2015-02-25 11:49:30

la norme POSIX spécifie les sémaphores inter-processus qui peuvent être utilisés à cette fin. http://linux.die.net/man/7/sem_overview

multiprocessing module en Python est construit sur cette API et d'autres. En particulier, multiprocessing.Lock fournit un processus croisé "mutex". http://docs.python.org/library/multiprocessing.html#synchronization-between-processes

EDIT pour répondre à édité question:

Dans votre validation de principe chaque processus est en train de construire un Lock(). Donc, vous avez deux verrous. C'est pourquoi ni le processus attend. Vous aurez besoin de partager la même serrure entre les processus. La section I lié à la multiprocessing documentation explique comment faire.

11
répondu wberry 2011-08-03 20:03:26

ilock bibliothèque:

from ilock import ILock

with ILock('Unique lock name'):
    # The code should be run as a system-wide single instance
    ...
4
répondu Symon 2018-03-08 16:28:20

pour un mutex à l'échelle du système qui permet la synchronisation de processus absolument séparés (i.e., pour inclure des processus Linux qui n'appartiennent pas à la même arborescence de processus), utilisez simplement fcntl.troupeau. Je suppose que L'utilisation d'un fichier mémoire sous le dossier /run/shm de Linux peut le faire fonctionner plus rapidement.

Voir plus ici.

1
répondu Ofer 2016-05-19 12:07:58