Heim >Backend-Entwicklung >Python-Tutorial >So teilen Sie eine Sperre zwischen Prozessen in Python mithilfe von Multiprocessing

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

Linda Hamilton
Linda HamiltonOriginal
2024-10-17 11:12:02937Durchsuche

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: Verwendung 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 rationalisiert den Prozess.

Hier ist ein Beispiel für 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>

Das obige ist der detaillierte Inhalt vonSo teilen Sie eine Sperre zwischen Prozessen in Python mithilfe von Multiprocessing. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn