Tengo problemas con el módulo de multiprocesamiento. Estoy usando un grupo de trabajadores con su método de mapa para cargar datos de muchos archivos y para cada uno de ellos analizo datos con una función personalizada. Cada vez que se procesa un archivo, me gustaría tener un contador actualizado para que pueda hacer un seguimiento de cuántos archivos quedan por procesar. Aquí es código de ejemplo:Multiproceso de Python y un contador compartido
def analyze_data(args):
# do something
counter += 1
print counter
if __name__ == '__main__':
list_of_files = os.listdir(some_directory)
global counter
counter = 0
p = Pool()
p.map(analyze_data, list_of_files)
no puedo encontrar una solución para esto.
¡Excelente respuesta! Tuve el mismo problema en IronPython, y aunque multiprocesamiento.Valor no está disponible, puede hacer algo similar con clr.Reference y System.Threading.Interlocked: http://stackoverflow.com/questions/2255461/how-to-atomically- increment-a-static-member-in-ironpython/2314858 # 2314858 –
@jkp, ¿cómo lo harías sin la variable global? - Estoy tratando de usar una clase, pero no es tan fácil como parece. Consulte http://stackoverflow.com/questions/1816958/cant-pickle-type-instancemethod-when-using-pythons-multiprocessing-pool-ma – Anna
Desafortunadamente, este ejemplo parece estar defectuoso, ya que 'counter.value + = 1 'no es atómico entre procesos, por lo que el valor será incorrecto si se ejecuta lo suficiente con unos pocos procesos –