Python 线程池并发问题 全局变量操作导致数据混乱

获取数据想要用一个全局的DataFrame将方法返回的多个DataFrame进行拼接,使用线程池多线程操作全局变量导致数据混乱,每次运行出来的数据量都不一样。多个线程同时修改一个变量,导致数据混乱。

第一次运行:5765条数据

第二次运行:5122条数据

第三次运行:5128条数据

解决方法:

在程序中自己手动加同步锁Lock。用Lock.acquire()锁住要访问的资源,等访问资源后,用Lock.release()释放资源,确保每次只有一个线程访问该资源。

 注意:不需要整个方法上锁,只需要在会造成数据出错的地方上锁,比如修改全局变量时。

datas = pd.DataFrame()
lock = threading.Lock()   # Lock同步锁


def get_datas(province):
    global datas    # 全局变量
    df = get_data(province)

    lock.acquire()  # 锁住资源
    try:  # 只需要锁住修改全局变量的部分
        datas = pd.concat([df, datas], ignore_index=True)
    finally:
        lock.release()  # 释放资源

比较普通方式和使用多线程+锁后的运行时间,明显使用多线程+锁后的程序运行快了许多。

 

 

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值