"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment partager un verrou entre des processus en Python à l'aide du multitraitement

Comment partager un verrou entre des processus en Python à l'aide du multitraitement

Publié le 2024-11-05
Parcourir:995

How to Share a Lock Between Processes in Python Using Multiprocessing

Partage d'un verrou entre les processus en Python

Lorsque vous essayez d'utiliser pool.map() pour cibler une fonction avec plusieurs paramètres, y compris un objet Lock(), c'est crucial pour résoudre la question du partage du verrou entre les sous-processus. Le multiprocessing.Lock() conventionnel ne peut pas être transmis directement aux méthodes Pool en raison de limitations de décapage.

Option 1 : Utiliser Manager et Manager.Lock()

Une approche consiste à utiliser Manager() et instanciez un Manager.Lock(). Bien que cette méthode soit fiable, elle implique une surcharge plus importante en raison du processus supplémentaire qui héberge le serveur Manager. De plus, les opérations de verrouillage nécessitent une communication avec ce serveur via IPC.

Option 2 : passer le verrouillage lors de la création du pool avec l'initialiseur

Vous pouvez également transmettre le multiprocessing.Lock() normal lors de l'initialisation du pool en utilisant l'argument du mot-clé d'initialisation. Cela garantit que l’instance de verrouillage est globale dans tous les travailleurs enfants. Cette méthode élimine la nécessité de fonctions partielles et rationalise le processus.

Voici un exemple utilisant l'option 2 :

def target(iterable_item):
    for item in items:
        # Do cool stuff
        if (... some condition here ...):
            lock.acquire()
            # Write to stdout or logfile, etc.
            lock.release()

def init(l):
    global lock
    lock = l

def main():
    iterable = [1, 2, 3, 4, 5]
    l = multiprocessing.Lock()
    pool = multiprocessing.Pool(initializer=init, initargs=(l,))
    pool.map(target, iterable)
    pool.close()
    pool.join()
Déclaration de sortie Cet article est réimprimé à l'adresse : 1729132755. En cas d'infraction, veuillez contacter [email protected] pour le supprimer.
Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3