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 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()
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