#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:
Привет, для выполнения транзакций вам необходимо открыть соединение с каждым потоком. Как это работает, когда вы открываете соединение, эти соединения передаются пулом. Если вы открываете одно соединение, это соединение всегда используется одним процессом и не позволяет другому подключиться.
Это не приведет к созданию каких-либо бутылочных горлышек, потому что, когда одно соединение свободно, это соединение будет выбрано из пула.