使用 python2 中的 pool.apply_async 未将值插入 MySQL table。7

Values are not inserted into MySQL table using pool.apply_async in python2.7

我正在尝试 运行 以下代码为某个应用程序并行填充 table。首先定义了以下函数,它应该连接到我的数据库并使用给定的值执行 sql 命令(插入 table)。

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()

一切正常,没有错误。但最后,我的 table 是空的,这意味着插入不成功。经过多次 google 搜索后,我尝试了很多方法来解决这个问题(包括添加用于插入的列名),但都没有成功。任何建议,将不胜感激。 (运行ning code in python2.7, gcloud (ubuntu) 注意这里粘贴后缩进可能有点乱)

另请注意,"chunk" 完全遵循所需的数据格式。

注意。这是example的一部分 请注意,我在上面的示例(链接)中唯一改变的是我将创建和插入 tables 的步骤分开,因为我在 gcloud 平台上 运行ning 我的代码它执行 GTID 标准。

解决方案是将 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()