【发布时间】:2016-10-27 10:43:37
【问题描述】:
当你开始使用线程时,你必须非常了解一些东西,主要是关于共享数据的同步。你必须使用锁、rlocks、信号量等等。即使是非常简单的共享数据也能写吗?
例如,我有两个线程共享一个全局资源,一个简单的布尔变量。
import threading
import random
import time
active = True
class T1(threading.Thread):
def run(self):
while active:
print("Hello") # do some work
time.sleep(0.1)
class T2(threading.Thread):
def run(self):
global active
while random.random() > 0.05:
time.sleep(1)
active = False
t1, t2 = T1(), T2()
t1.start()
t2.start()
t1.join()
t2.join()
它似乎有效,但 python 能保证它有效吗?如果是,那么它的工作原理是什么?
我有三个答案。
- 之所以有效,是因为布尔变量的访问始终是原子的(它不能被另一个线程中断)。在这种情况下,Python 保证什么是原子操作?整数、列表、字典的访问是原子的吗?
- Python 不保证此代码每次都能正常工作。解决方案是使用锁来访问两个线程中的活动变量。
- 之所以有效,是因为只有一个线程写入变量。另一个线程只读取它。
这是另一个代码:
import threading
import random
import time
numbers = [3]
class T1(threading.Thread):
def run(self):
while sum(numbers) % 3 == 0:
print("Hello") # do some work
time.sleep(0.1)
class T2(threading.Thread):
def run(self):
global active
while random.random() > 0.2:
numbers.extend([1, 2])
time.sleep(1)
numbers.append(4)
t1, t2 = T1(), T2()
t1.start()
t2.start()
t1.join()
t2.join()
现在单一和“复杂”指令numbers.extend([1, 2])可以被T1线程中断吗?如果是这种情况,在添加 1 之后,添加 2 之前,T1 可能会在 T2 之前意外停止。
【问题讨论】:
标签: python multithreading thread-safety