Значения не вставляются в таблицу MySQL с помощью pool.apply_async в python2.7 - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь запустить следующий код для параллельного заполнения таблицы для определенного приложения. Сначала определяется следующая функция, которая должна подключиться к моей базе данных и выполнить команду sql с указанными значениями (вставить в таблицу).

def dbWriter(sql, rows) :
   # load cnf file
    MYSQL_CNF = os.path.abspath('.') + '/mysql.cnf'
    conn = MySQLdb.connect(db='dedupe',
                       charset='utf8',
                       read_default_file = MYSQL_CNF)

    cursor = conn.cursor()
    cursor.executemany(sql, rows)
    conn.commit()
    cursor.close()

    conn.close()

А затем есть этот кусок:

pool = dedupe.backport.Pool(processes=2)

done = False

while not done :
    chunks = (list(itertools.islice(b_data, step)) for step in 
      [step_size]*100)


    results = []

    for chunk in chunks :
        print len(chunk)
        results.append(pool.apply_async(dbWriter,
                                    ("INSERT INTO blocking_map VALUES (%s, %s)",
                                     chunk)))

    for r in results :

        r.wait()

    if len(chunk) < step_size :
        done = True


pool.close()

Все работает и ошибок нет. Но в конце моя таблица пуста, что означает, что вставки были неудачными. Я пробовал так много вещей, чтобы исправить это (включая добавление имен столбцов для вставки) после многих поисков в Google, и не увенчались успехом. Мы ценим любые предложения. (запуск кода на python2.7, gcloud (ubuntu). обратите внимание, что отступы могут быть немного испорчены после вставки здесь)

Обратите также внимание, что «чанк» точно соответствует требуемому формату данных.

Примечание. Это часть этого примера Обратите внимание, что единственное, что я изменяю в приведенном выше примере (связан), - это то, что я разделяю шаги по созданию и вставке в таблицы, так как я запускаю свой код на платформе gcloud и он применяет стандарты GTID.

1 Ответ

0 голосов
/ 24 мая 2018

Решением было изменение функции dbwriter на:

conn = MySQLdb.connect(host = # host ip,
                 user = # username, 
                 passwd = # password,
                 db = 'dedupe')
cursor = conn.cursor()
cursor.executemany(sql, rows)
cursor.close()
conn.commit()
conn.close()
...