python多线程执行数据导入脚本

应用场景

某个业务中由于并发问题导致的数据重复,给不同的会员分配了相同的卡券,在解决了并发数据重复的问题之后,需要对原先的重复数据进行修复,于是写了一个python的脚本文件用于纠正这个问题。脚本本身没有问题,问题在于,重复的数据有6000余行,而一条数据的修复操作大概需要1秒,这就需要2个小时左右才能跑完整个脚本。想要对整个过程进行加速处理,自然而然地想到了多线程。

遇到的问题

python3已经对原有的多线程进行了升级处理,官方推荐使用futures来进行并发的任务处理,我们这里就使用futures来实现多并发的数据处理。

1
2
3
with futures.ThreadPoolExecutor(max_workers=5) as executor:
for i in range(len(my.keys)):
executor.submit(my.mult_handle)

max_workers 是启动线程的数量,executor可以根据任务的数量适量添加。

然后发现脚本报了如下的错误:

1
pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0

解决方案

在脚本中不能使用多线程共享同一数据库连接,需要在每个execute方法前加上互斥锁

1
2
3
lock.acquire()
cursor.execute(command,data)
lock.release()