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.
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.
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!