„Wenn ein Arbeiter seine Arbeit gut machen will, muss er zuerst seine Werkzeuge schärfen.“ – Konfuzius, „Die Gespräche des Konfuzius. Lu Linggong“
Titelseite > Programmierung > So teilen Sie eine Sperre zwischen Prozessen in Python mithilfe von Multiprocessing

So teilen Sie eine Sperre zwischen Prozessen in Python mithilfe von Multiprocessing

Veröffentlicht am 05.11.2024
Durchsuche:734

How to Share a Lock Between Processes in Python Using Multiprocessing

Eine Sperre zwischen Prozessen in Python teilen

Beim Versuch, pool.map() als Ziel für eine Funktion mit mehreren Parametern, einschließlich eines Lock()-Objekts, zu verwenden, ist dies der Fall Dies ist von entscheidender Bedeutung, um das Problem der gemeinsamen Nutzung der Sperre zwischen Unterprozessen anzugehen. Das herkömmliche multiprocessing.Lock() kann aufgrund von Pickling-Einschränkungen nicht direkt an Pool-Methoden übergeben werden.

Option 1: Verwenden von Manager und Manager.Lock()

Ein Ansatz besteht darin, Manager() zu verwenden. und instanziieren Sie einen Manager.Lock(). Obwohl diese Methode zuverlässig ist, verursacht sie aufgrund des zusätzlichen Prozesses, der den Manager-Server hostet, einen höheren Overhead. Darüber hinaus erfordern Sperrvorgänge eine Kommunikation mit diesem Server über IPC.

Option 2: Sperre bei Pool-Erstellung mit Initialisierer übergeben

Alternativ können Sie das reguläre multiprocessing.Lock() während der Pool-Initialisierung mit übergeben das Initialisierungsschlüsselwortargument. Dadurch wird sichergestellt, dass die Sperrinstanz in allen untergeordneten Arbeitern global ist. Diese Methode macht Teilfunktionen überflüssig und optimiert den Prozess.

Hier ist ein Beispiel mit 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()
Freigabeerklärung Dieser Artikel wird unter folgender Adresse abgedruckt: 1729132755 Bei Verstößen wenden Sie sich bitte an [email protected], um ihn zu löschen
Neuestes Tutorial Mehr>

Haftungsausschluss: Alle bereitgestellten Ressourcen stammen teilweise aus dem Internet. Wenn eine Verletzung Ihres Urheberrechts oder anderer Rechte und Interessen vorliegt, erläutern Sie bitte die detaillierten Gründe und legen Sie einen Nachweis des Urheberrechts oder Ihrer Rechte und Interessen vor und senden Sie ihn dann an die E-Mail-Adresse: [email protected] Wir werden die Angelegenheit so schnell wie möglich für Sie erledigen.

Copyright© 2022 湘ICP备2022001581号-3