为了账号安全,请及时绑定邮箱和手机立即绑定

如何在 Python 中使时间戳原子/中断安全?

如何在 Python 中使时间戳原子/中断安全?

慕神8447489 2022-07-26 16:31:19
这应该很容易。看了怎么回事,我不太确定。单个二进制整数的写入/读取是原子的吗?这就是底层硬件读取和写入 32 位整数的方式。经过一番研究,我意识到 Python 不会将整数存储为字节集合。它甚至不将字节存储为字节集合。涉及开销。这种开销是否会破坏二进制整数的原子性质?这是我用来解决这个问题的一些代码:import timeimport systm=time.time()int_tm = int(tm * 1000000)bin_tm = bin(int_tm)int_bin_tm = int(bin_tm, 2)print('tm:', tm, ", Size:", sys.getsizeof(tm))print('int_tm:', int_tm, ", Size:", sys.getsizeof(int_tm))print('bin_tm:', bin_tm, ", Size:", sys.getsizeof(bin_tm))print('int_bin_tm:', int_bin_tm, ", Size:", sys.getsizeof(int_bin_tm))输出:tm: 1581435513.076924 , Size: 24int_tm: 1581435513076924 , Size: 32bin_tm: 0b101100111100100111010100101111111011111110010111100 , Size: 102int_bin_tm: 1581435513076924 , Size: 32对于几个附带的问题,Python 的整数二进制表示真的会消耗这么多内存吗?我是否使用错误的类型将十进制整数转换为字节?
查看完整描述

1 回答

?
犯罪嫌疑人X

TA贡献2080条经验 获得超4个赞

除了特定的互斥体结构(如锁信号量)之外,Python 不保证任何原子操作。有些操作看起来是原子的,因为GIL会阻止字节码同时在多个 python 线程上运行“这个锁是必要的,主要是因为 CPython 的内存管理不是线程安全的”。

基本上这意味着python将确保在允许另一个线程继续之前完全评估整个字节码指令。然而,这并不意味着整行代码可以保证不间断地完成。对于函数调用尤其如此。要更深入地了解这一点,请查看dis模块。

我还要指出,关于原子性的讨论在硬件层面没有任何意义,解释语言的整个想法是抽象出硬件。如果你想考虑“实际的”硬件原子性,它通常是操作系统提供的一个函数(这就是 python 可能实现的方式threading.Lock)。

注意数据大小(这只是一个快速的问题,因为这是另一个问题):

sizeof(tm): 8 字节用于 64 位浮点数,8 字节用于指向数据类型的指针,以及 8 字节用于指向引用计数的指针

sizeof(int_tm):整数有点复杂,因为一些小值使用较小的格式“缓存”以提高效率,然后大值使用更灵活的类型,其中用于存储 int 的字节数可以扩展到所需的大小。

sizeof(bin_tm):这实际上是一个字符串,这就是为什么它比一个数字占用更多的内存,有相当大的开销,加上每个字符至少一个字节。

“我是否使用了错误的类型进行转换......?” 我们需要知道您要对结果做什么才能回答这个问题。


查看完整回答
反对 回复 2022-07-26
  • 1 回答
  • 0 关注
  • 73 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信