sto usando multiprocessing.Pool()
multiprocessing.pool.map e la funzione con due argomenti
ecco quello che voglio 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.
voglio passare 2 argomenti Quello che voglio fare è quello di inizializza solo 4 connessioni DB (qui cercherò di creare una connessione su ogni chiamata di funzione quindi possibilmente milioni di esse e causerà la morte di IO Freezed). se posso creare 4 connessioni db e 1 per ogni processo sarà ok.
Esiste una soluzione per Pool? o dovrei abbandonarlo?
EDIT:
Da aiuto di tutti e due ho ottenuto questo in questo modo:
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')]
Così qui come funzionera ', io gonna spostare DB codice di connessione verso il livello principale e fai questo:
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ì, ho intenzione di testarlo e farvelo sapere.
Si noti che la sintassi 'def f ((arg1, arg2)):' è scomparsa in Python 3. –
@FerdinandBeyer: L'avevo dimenticato. Bene, a meno che l'implementazione di multiprocessing.Pool.map sia diversa lì, la strada da percorrere sarebbe quella di assegnare a un singolo argomento e decomprimerlo all'interno della funzione. – jsbueno
Grazie ho funzionato! ho capito facendo zip (file_list, ciclo (dbs)). Ma io non uso f ((arg1, arg2)). come ho usato più del tuo codice ti ho selezionato! –