que estoy usando multiprocessing.Pool()
multiprocessing.pool.map y la función con dos argumentos
Esto es lo que quiero Piscina:
def insert_and_process(file_to_process,db):
db = DAL("path_to_mysql" + db)
#Table Definations
db.table.insert(**parse_file(file_to_process))
return True
if __name__=="__main__":
file_list=os.listdir(".")
P = Pool(processes=4)
P.map(insert_and_process,file_list,db) # here having problem.
quiero pasar 2 argumentos Lo que quiero hacer es Inicialice solo 4 conexiones DB (aquí intentaré crear una conexión en cada llamada a la función, posiblemente millones de ellas y causar IO Freezed hasta la muerte). si puedo crear 4 conexiones de db y 1 para cada proceso, estará bien.
¿Hay alguna solución para Pool? o debería abandonarlo?
EDIT:
De ayuda de los dos tengo esto al hacer esto:
args=zip(f,cycle(dbs))
Out[-]:
[('f1', 'db1'),
('f2', 'db2'),
('f3', 'db3'),
('f4', 'db4'),
('f5', 'db1'),
('f6', 'db2'),
('f7', 'db3'),
('f8', 'db4'),
('f9', 'db1'),
('f10', 'db2'),
('f11', 'db3'),
('f12', 'db4')]
Así que aquí la forma en que va a funcionar, me va a mover el código de conexión DB a la planta principal y haz esto:
def process_and_insert(args):
#Table Definations
args[1].table.insert(**parse_file(args[0]))
return True
if __name__=="__main__":
file_list=os.listdir(".")
P = Pool(processes=4)
dbs = [DAL("path_to_mysql/database") for i in range(0,3)]
args=zip(file_list,cycle(dbs))
P.map(insert_and_process,args) # here having problem.
Sí, voy a probarlo y que sepas.
Tenga en cuenta que la sintaxis 'def f ((arg1, arg2)):' ha desaparecido en Python 3. –
@FerdinandBeyer: Lo había olvidado. Bueno, a menos que la implementación de multiprocesamiento.Pool.map sea diferente allí, el camino a seguir sería asignar a un único argumento y descomprimirlo dentro de la función. – jsbueno
Gracias lo tengo trabajando! Lo obtuve haciendo zip (file_list, cycle (dbs)). Pero no uso f ((arg1, arg2)). como utilicé más código, ¡te seleccioné! –