Maison  >  Article  >  développement back-end  >  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

Linda Hamilton
Linda Hamiltonoriginal
2024-10-17 11:12:02910parcourir

How to Share a Lock Between Processes in Python Using Multiprocessing

Partage d'un verrou entre 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 des 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() régulier 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 :

<code class="python">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()</code>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn