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.
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. –
@LittleSanti abbiamo usato invece un pool di connessioni. Funziona davvero bene. – Ninz
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. –