当前位置: 首页 > 面试题库 >

变量交换是否保证在python中是原子的?

师向文
2023-03-14
问题内容

参考以下链接:http : //docs.python.org/faq/library.html#what-
kinds-of-global-value-mutation-are-thread-
safe

我想知道以下情况:

(x, y) = (y, x)

在cPython中将保证是原子的。(x和y都是python变量)


问题答案:

让我们来看看:

>>> x = 1
>>> y = 2
>>> def swap_xy():
...   global x, y
...   (x, y) = (y, x)
... 
>>> dis.dis(swap_xy)
  3           0 LOAD_GLOBAL              0 (y)
              3 LOAD_GLOBAL              1 (x)
              6 ROT_TWO             
              7 STORE_GLOBAL             1 (x)
             10 STORE_GLOBAL             0 (y)
             13 LOAD_CONST               0 (None)
             16 RETURN_VALUE

它不会出现,他们是原子:x的和y的值可以被另一个线程之间改变LOAD_GLOBAL字节码,之前或之后ROT_TWO,和之间的STORE_GLOBAL字节码。

如果要原子交换两个变量,则需要一个锁或一个互斥锁。

对于那些需要经验证明的人:

>>> def swap_xy_repeatedly():
...   while 1:
...     swap_xy()
...     if x == y:
...       # If all swaps are atomic, there will never be a time when x == y.
...       # (of course, this depends on "if x == y" being atomic, which it isn't;
...       #  but if "if x == y" isn't atomic, what hope have we for the more complex
...       #  "x, y = y, x"?)
...       print 'non-atomic swap detected'
...       break
... 
>>> t1 = threading.Thread(target=swap_xy_repeatedly)
>>> t2 = threading.Thread(target=swap_xy_repeatedly)
>>> t1.start()
>>> t2.start()
>>> non-atomic swap detected


 类似资料:
  • 本文向大家介绍Python中变量交换的例子,包括了Python中变量交换的例子的使用技巧和注意事项,需要的朋友参考一下 Python追求简洁,诞生不少运算赋值规则,力求从简,其中就包括两个或者多个变量交换值。 普通语言中 在Python中,实现两个变量值交换非常方便 甚至可以多个变量同时交换 一个运算符就搞定多个变量值互换!

  • 问题内容: 给定两个值x和y,我想将它们传递给另一个函数,交换它们的值并查看结果。这在Java中可行吗? 问题答案: 不与原始类型(,,等)。Java按值传递东西,这意味着函数传递的变量是原始变量的副本,并且您对该副本所做的任何更改都不会影响原始变量。 现在,对象有所不同,因为对象变量的“值”实际上是对对象的引用-复制该引用使其指向完全相同的对象。 局限性在于,您仍然无法以调用者可以看到的任何方式

  • 问题内容: 假设我使用处理程序来处理间隔计时器。 我可以不用担心在设置(例如,Python VM正在执行字节码来设置变量)的情况下,信号处理程序中的分配会中断某些情况吗?(即 亚稳态 ) 更新 :我对在处理程序外部进行“复合赋值”的情况特别感兴趣。 (也许我想的太“低级”了,这一切都在Python中得到了解决……来自嵌入式系统的背景,我时常有这种冲动) 问题答案: 对简单变量的简单分配是“原子的”

  • 读了很多关于易失性、原子性和可见性的文章后,有一个问题仍然存在。以下跨线程工作,当更新/读取“B”时,“A”始终可见: 原子变量是独立的对象,这同样适用吗?下面的操作会起作用吗? 如果答案是否定的,那么扩展AtomicInteger类并在其中包含“a”就可以了,因为AtomicInteger包装了一个volatile。

  • 我正在搜索动觉数据流的文档,但我找不到像 动情保证至少一次交付 从生产者方面,我预计发送的消息会传播到多个节点(类似于Kafka的ack=all)从消费者方面,我预计在消费者成功处理时会有相当于Kafka提交偏移量的东西,或者类似于Google Cloud的Pub/Sub消息确认。 是否有动觉提交信息保证?是否有动觉处理保证(如果已处理并确认已处理,则将消息标记为只读)

  • 问题内容: 在Objective-C中,您可以区分原子性质和非原子性质: 根据我的理解,您可以安全地从多个线程读取和写入定义为原子的属性,而同时从多个线程中写入和访问非原子属性或ivars可能导致不确定的行为,包括严重的访问错误。 因此,如果您在Swift中有这样的变量: 我可以安全地并行读写该变量吗?(不考虑这样做的实际含义)。 问题答案: 假设尚无底层文档,这还为时尚早,但是您可以从汇编中学习