python免锁带来的收益

背景

在公司的业务中,使用Python来连接vSphere,收集vSphere管理的主机和虚拟机的配置数据,在vSphere管理了44个主机,5100个虚拟机(2025台虚拟机可收集)时,优化前,总收集时间是6分6秒,优化后,是2分45秒。

优化的方式

在代码中,是通过python的第三方库pyvmomi连接vSphere,连接认证之后,会返回连接对象,连接对象需要定时更新(更改)。收集数据时,也要使用连接对象获取数据。所以在更新连接对象和使用连接对象收集数据时,都加了锁。
在查询官网API说明之后,发现连接对象一般是30分钟左右更新一次。跟业务使用方核对后,业务方的要求是5分钟之内收集完数据,否则的话,放弃收集也可以。于是直接将更新连接对象的步骤去除,这样,使用连接对象来收集数据也不需要加锁,收集效率就提升上去了。
后来在网上看博客的时候,看到有些博客中,认为等号赋值操作,就是原子操作,不会造成数据安全问题,只有改变对象中多个属性的值,才有可能造成数据安全问题。我意识到直接将一个对象赋值给一个变量,即下面这样的代码,是不需要加锁,也可以保证原子操作。所以上述业务的老代码中,更新连接对象的操作,不用加锁,也是一个原子操作,是通过硬件的CPU原语来保证的,使用连接对象收集数据时,连接对象肯定是指向一个有效的地址:

# 对于connect_obj来说,如果有另一个线程在使用connect_obj,下面这行代码不会有多线程的数据安全问题,
# 因为等号'='的赋值操作是原子性的,是通过硬件来保障的。
connect_obj = get_connect_obj();

def getConnectObj():
	return xxx;

参考:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值