Многопроцессорная обработка Python на mysqldb

0

Я пытаюсь вставить, чтобы обновить действительно большие значения данных в 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?

Заранее спасибо,

  • 0
    После некоторых исследований с модулем у меня есть: MySQLdb. Кажется, что он не предлагает никакой многопоточности :(. Mysql-python.sourceforge.net/MySQLdb.html
Теги:
multithreading
multiprocessing

1 ответ

0

Существует лучший способ приблизиться к этому:

Соединение с пул соединениями Python:

  • Модуль mysql.connector.pooling реализует объединение.

  • Пул открывает несколько соединений и управляет безопасностью потоков при предоставлении соединений с запрашивающими.

  • Размер пула соединений настраивается при создании пула. После этого его нельзя изменить.

  • возможно иметь несколько пулов соединений. Это позволяет приложениям поддерживать пулы соединений с различными серверами MySQL, например.

Проверьте документацию здесь

Я думаю, что ваши параллельные процессы исчерпывают ваши соединения mysql.

  • 0
    Я пытался следовать документации и использовал: 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 . Я что-то пропустил?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню