многопоточность в mysql и python

#python #mysql #multithreading #python-multithreading #mysql-python

#python #mysql #многопоточность #python-многопоточность #mysql-python

Вопрос:

Я изучаю python и mysql, и с этим я хочу использовать многопоточность для записи в базе данных mysql

когда я пытаюсь это сделать и пытаюсь создать несколько потоков, отображается ошибка типа соединение не найдено, но если я попробую с 1 потоком, он работает нормально, но у него более низкая скорость, т.Е. 40 строк в секунду

пожалуйста, помогите мне сделать это, и если я делаю неправильно, пожалуйста, дайте мне знать, есть ли хороший способ сделать это спасибо

 import mysql.connector
from queue import Queue
from threading import Thread

mydb = mysql.connector.connect(
  host="localhost",
  user="root",
  password="",
  database="list"
)


def do_stuff(q):
      while True:
            mycursor = mydb.cursor()
            a=  q.get()
            sql = "INSERT INTO demo1 (id, name, price, tmp) VALUES (%s, %s, %s, %s)"
            val = (a[0], a[1],a[3],a[2])
            mycursor.execute(sql, val)

            mydb.commit()
            q.task_done()

q = Queue(maxsize=0)
num_threads = 1 #if I try more then 1 it throw error "IndexError: bytearray index out of range"

for i in range(num_threads):
        worker = Thread(target=do_stuff, args=(q,))
        worker.setDaemon(True)
        worker.start()
        
        
def strt():
    mycursor = mydb.cursor()
    sql = f"SELECT * FROM demo ORDER BY id"
    mycursor.execute(sql)
    myresult = mycursor.fetchall()
    for x in myresult:
        q.put(x)
            
strt()
 

Комментарии:

1. Попробуйте предоставить каждому потоку свой собственный соединитель.

2. спасибо @Mace, я понял

Ответ №1:

Привет, для выполнения транзакций вам необходимо открыть соединение с каждым потоком. Как это работает, когда вы открываете соединение, эти соединения передаются пулом. Если вы открываете одно соединение, это соединение всегда используется одним процессом и не позволяет другому подключиться.

Это не приведет к созданию каких-либо бутылочных горлышек, потому что, когда одно соединение свободно, это соединение будет выбрано из пула.

Источник