我无法理解 Python 中的锁
I have trouble understanding locks in Python
我正在玩 threading.Lock
并编写了以下测试以加深我的理解。
import threading
from time import sleep
LOCK = threading.Lock()
class Printer(threading.Thread):
def __init__(self, *args, **kwargs):
super(Printer, self).__init__(*args, **kwargs)
self.i = 0
def run(self):
while True:
print(self.i)
self.i += 1
sleep(1)
p = Printer()
p.start()
raw_input() # block main thread until return pressed
LOCK.acquire()
# stop printer for 6 seconds
for _ in range(3):
print('holding...')
sleep(2)
# let printer continue
LOCK.release()
我期望得到以下输出(注释不是输出的一部分):
0
1
2
# user pressed enter
holding...
holding...
holding...
3
4
5
...
但是,打印机没有停止 - 我得到的实际输出是:
0
1
2
# user pressed enter
holding...
3
4
holding...
5
6
holding...
7
8
...
显然我误解了什么?如何暂停打印机?
您还必须在您的线程中获取锁。锁本身根本不做任何事情。它的唯一目的是使您无法两次获得锁——从而使代码的两个或多个部分相互排斥。无论谁获得锁,都可以继续进行,而其他所有线程在尝试获取锁时都会阻塞。
考虑这个版本的代码(我使用的是 with
,但您也可以将其替换为 acquire/release。
import threading
from time import sleep
LOCK = threading.Lock()
class Printer(threading.Thread):
def __init__(self, *args, **kwargs):
super(Printer, self).__init__(*args, **kwargs)
self.i = 0
def run(self):
while True:
with LOCK:
print(self.i)
self.i += 1
sleep(1)
p = Printer()
p.start()
raw_input() # block main thread until return pressed
LOCK.acquire()
# stop printer for 6 seconds
for _ in range(3):
print('holding...')
sleep(2)
# let printer continue
LOCK.release()
这会做你想做的事。
这仍然不是 "right",因为您的主线程在释放锁后立即退出。通常这会被认为是糟糕的编程,但在演示脚本中它可能无关紧要。你只是不再对你的线程有任何控制 - 它会 运行 在那里直到被信号杀死。
我正在玩 threading.Lock
并编写了以下测试以加深我的理解。
import threading
from time import sleep
LOCK = threading.Lock()
class Printer(threading.Thread):
def __init__(self, *args, **kwargs):
super(Printer, self).__init__(*args, **kwargs)
self.i = 0
def run(self):
while True:
print(self.i)
self.i += 1
sleep(1)
p = Printer()
p.start()
raw_input() # block main thread until return pressed
LOCK.acquire()
# stop printer for 6 seconds
for _ in range(3):
print('holding...')
sleep(2)
# let printer continue
LOCK.release()
我期望得到以下输出(注释不是输出的一部分):
0
1
2
# user pressed enter
holding...
holding...
holding...
3
4
5
...
但是,打印机没有停止 - 我得到的实际输出是:
0
1
2
# user pressed enter
holding...
3
4
holding...
5
6
holding...
7
8
...
显然我误解了什么?如何暂停打印机?
您还必须在您的线程中获取锁。锁本身根本不做任何事情。它的唯一目的是使您无法两次获得锁——从而使代码的两个或多个部分相互排斥。无论谁获得锁,都可以继续进行,而其他所有线程在尝试获取锁时都会阻塞。
考虑这个版本的代码(我使用的是 with
,但您也可以将其替换为 acquire/release。
import threading
from time import sleep
LOCK = threading.Lock()
class Printer(threading.Thread):
def __init__(self, *args, **kwargs):
super(Printer, self).__init__(*args, **kwargs)
self.i = 0
def run(self):
while True:
with LOCK:
print(self.i)
self.i += 1
sleep(1)
p = Printer()
p.start()
raw_input() # block main thread until return pressed
LOCK.acquire()
# stop printer for 6 seconds
for _ in range(3):
print('holding...')
sleep(2)
# let printer continue
LOCK.release()
这会做你想做的事。
这仍然不是 "right",因为您的主线程在释放锁后立即退出。通常这会被认为是糟糕的编程,但在演示脚本中它可能无关紧要。你只是不再对你的线程有任何控制 - 它会 运行 在那里直到被信号杀死。