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 秒后打印消息。
我正在尝试在 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 秒后打印消息。