我无法理解 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",因为您的主线程在释放锁后立即退出。通常这会被认为是糟糕的编程,但在演示脚本中它可能无关紧要。你只是不再对你的线程有任何控制 - 它会 运行 在那里直到被信号杀死。