Python 中信号量的使用

Usage of Semaphores in Python

我正在尝试在 Python 中使用信号量来阻止线程的执行,并根据某些条件在另一个线程中释放信号量(在我的情况下通过 tcp 接收一些内容)。

但它不起作用,我的主线程没有像我想象的那样被阻塞。我的最小示例:

import time
from threading import Thread, Semaphore

class ServerManager():
  sem = Semaphore()
  
  def run(self):
    time.sleep(15)
    self.sem.release()

manager = ServerManager()
thread = Thread(target = manager.run)
thread.start()
  
manager.sem.acquire()
print("I am here immediately but should not")

该消息会立即打印在控制台中,但在我的示例中应该仅在 15 秒后打印。我确定我做错了什么,但是什么?

您需要阅读有关 threading.Semaphore 的文档。当线程尝试 acquire 并且计数器为 0 时,信号量会阻塞。当您创建 Semaphore 时,默认计数为 1,因此您的 acquire 能够立即成功。我怀疑你想要

    sem = Semaphore(0)

因此资源立即不可用。

Tim Roberts 的回答是 right.I 阅读了 Python 文档,但我不明白。我(错误地)认为默认值具有我想要的行为。完整代码为:

我应该做的:

import time
from threading import Thread, Semaphore

class ServerManager():
  sem = Semaphore(0)
  
  def run(self):
    time.sleep(15)
    self.sem.release()

manager = ServerManager()
thread = Thread(target = manager.run)
thread.start()
  
manager.sem.acquire()
print("I am here immediately but should not")

15 秒后打印消息。