Я пытаюсь вставить, чтобы обновить действительно большие значения данных в mysql db и в той же попытке, которую я пытался увидеть в списке процессов, что делает!
Поэтому я сделал следующий скрипт:
У меня есть модифицированный db mysql, который заботится о подключении. Все работает нормально, если я не использую многопроцессы, если я использую многопроцессорную обработку, я получил сообщение об ошибке "потерянное соединение с базой данных".
Сценарий выглядит так:
from mysql import DB
import multiprocessing
def check writing(db):
result = db.execute("show full processlist").fethcall()
for i in result:
if i['State'] == "updating":
print i['Info']
def main(db):
# some work to create a big list of tuple called tuple
sql = "update 'table_name' set 'field' = %s where 'primary_key_id' = %s"
monitor = multiprocessing.Process(target=check_writing,args=(db,)) # I create the monitor process
monitor.start()
db.execute_many(sql,tuple) # I start to modify table
monitor.terminate()
monitor.join
if __name__ == "__main__"
db = DB(host,user,password,database_name) # this way I create the object connected
main(db)
db.close()
И часть моего класса mysql:
class DB:
def __init__(self,host,user,password,db_name)
self.db = MySQLdb.connect(host=host.... etc
def execute_many(self,sql,data):
c = self.db.cursor()
c.executemany(sql, data)
c.close()
self.db.commit()
Как я уже говорил, если я не пытаюсь выполнить check_writing, скрипт работает нормально!
Может быть, кто-то может объяснить мне, в чем причина и как можно преодолеть? Также у меня возникают проблемы с написанием threadPool в MySQL с помощью map (или map_async). Я пропустил что-то, связанное с mysql?
Заранее спасибо,
Существует лучший способ приблизиться к этому:
Соединение с пул соединениями Python:
Модуль mysql.connector.pooling реализует объединение.
Пул открывает несколько соединений и управляет безопасностью потоков при предоставлении соединений с запрашивающими.
Размер пула соединений настраивается при создании пула. После этого его нельзя изменить.
возможно иметь несколько пулов соединений. Это позволяет приложениям поддерживать пулы соединений с различными серверами MySQL, например.
Я думаю, что ваши параллельные процессы исчерпывают ваши соединения mysql.
self.db = MySQLdb.connect(pool_name = "mypool", pool_size = 3, host=host, user=user, passwd=passwd, db=db_name, port=port, cursorclass=MySQLdb.cursors.DictCursor, charset='utf8', init_command='SET NAMES UTF8')
. Но я получаю это: TypeError: 'pool_name' is an invalid keyword argument for this function
. Я что-то пропустил?