参考以下链接: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中有这样的变量: 我可以安全地并行读写该变量吗?(不考虑这样做的实际含义)。 问题答案: 假设尚无底层文档,这还为时尚早,但是您可以从汇编中学习