应用场景
某个业务中由于并发问题导致的数据重复,给不同的会员分配了相同的卡券,在解决了并发数据重复的问题之后,需要对原先的重复数据进行修复,于是写了一个python的脚本文件用于纠正这个问题。脚本本身没有问题,问题在于,重复的数据有6000余行,而一条数据的修复操作大概需要1秒,这就需要2个小时左右才能跑完整个脚本。想要对整个过程进行加速处理,自然而然地想到了多线程。
遇到的问题
python3已经对原有的多线程进行了升级处理,官方推荐使用futures来进行并发的任务处理,我们这里就使用futures来实现多并发的数据处理。
1 | with futures.ThreadPoolExecutor(max_workers=5) as executor: |
max_workers 是启动线程的数量,executor可以根据任务的数量适量添加。
然后发现脚本报了如下的错误:
1 | pymysql.err.InternalError: Packet sequence number wrong - got 45 expected 0 |
解决方案
在脚本中不能使用多线程共享同一数据库连接,需要在每个execute方法前加上互斥锁
1 | lock.acquire() |