2015-10-20 17 views
5

Sto provando a passare una connessione mysql a un thread in python. Se eseguo l'inizializzazione di mysql all'interno della classe worker, non ci sono errori.Ottenere pipe interrotte quando si passa la connessione mysql a un thread python

Tuttavia, potrebbe essere costoso per la connessione, quindi ho provato a passare la connessione mysql dalla funzione chiamante (vedere il codice di seguito). Ma questo continua a lanciare questo errore:

(2006, "MySQL server has gone away (BrokenPipeError(32, 'Broken pipe'))

Qualche idea del perché? Penso che sia perché il percorso si passa la connessione mysql

def worker(db): 
""" Distributes the workload for a thread 
""" 
while True: 
    item = queue_handler.get() 
    perform_insert(item, db) 
    queue_handler.task_done() 

def insert_bulk(params): 
""" Handles the insert 
""" 
    cntr = 0 
    res = [] 
    cannot_read = [] 
    (data, cms, report_id) = params 

    db = nmi_mysql.DB(CONFIG['earnings_db'], True) 

    for i in range(10): 
     thrd = threading.Thread(target=worker, args=(db,)) 
     thrd.deamon = True 
     thrd.start() 

    for row in data: 
     split_files = row.split(',') 

     if len(split_files) != 34: 
      cannot_read.append(split_files) 
      continue 

     now = datetime.datetime.now() 

     res.append(<some data to insert>) 

     if len(res) == 750 or cntr == len(data): 
      queue_handler.put([res, cms, report_id]) 
      res = [] 

     cntr += 1 

    queue_handler.join() 

    db.close() 

    return [len(res), cms] 

UPDATE

Invece di passare la connessione mysql, abbiamo creato un pool di connessioni e l'uso che piscina nei fili. In questo modo, otteniamo semplicemente la connessione dal pool a livello di thread.

+0

In genere, le connessioni al database non devono essere utilizzate tra diversi thread client: non sono _thread-safe_. Se nessuno ti offre una risposta migliore, ti consiglio di elaborare ogni connessione nello stesso thread: aprire, utilizzare e chiudere. –

+0

@LittleSanti abbiamo usato invece un pool di connessioni. Funziona davvero bene. – Ninz

+0

Va bene usare un pool mentre si gestiscono tutte le connessioni all'interno dello stesso thread: ottenere la connessione, usarla, rilasciarla. Il motivo è sempre lo stesso: le connessioni di solito non sono thread-safe. –

risposta

2

Le connessioni al database non sono thread-safe, quindi non è necessario passarle da un thread a un altro. Un pool di connessioni mantiene le connessioni aperte tra le richieste, quindi è più veloce ottenere una connessione dal pool, utilizzarla per una query e quindi rilasciarla.

Questo related answer ha alcuni collegamenti utili sulla sicurezza del thread delle connessioni del database.

+0

La mia risposta è principalmente un riassunto dei commenti. L'ho appena pubblicato in modo che questa domanda venga rimossa dall'elenco delle domande senza risposta. –