Al intentar utilizar pool.map() para apuntar a una función con múltiples parámetros, incluido un objeto Lock(), es Es crucial abordar la cuestión de compartir el bloqueo entre subprocesos. El multiprocesamiento convencional.Lock() no se puede pasar directamente a los métodos Pool debido a limitaciones de decapado.
Un enfoque es utilizar Manager() y crear una instancia de Manager.Lock(). Si bien este método es confiable, implica más gastos generales debido al proceso adicional que aloja el servidor Manager. Además, las operaciones de bloqueo requieren comunicación con este servidor a través de IPC.
Alternativamente, puede pasar el multiprocesamiento regular.Lock() durante la inicialización del grupo usando el argumento de la palabra clave inicializador. Esto garantiza que la instancia de bloqueo sea global en todos los trabajadores infantiles. Este método elimina la necesidad de funciones parciales y agiliza el proceso.
Aquí hay un ejemplo usando la Opción 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()
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3