信号量是一种允许多个线程同时访问共享资源的同步机制。在 Python 中,可以使用 threading.Semaphore 类来创建一个信号量。信号量有两个操作:acquire() 和 release()。acquire() 方法用于获取信号量,如果信号量的计数器为零,则线程将被阻塞,直到有一个线程释放信号量;release() 方法用于释放信号量,使计数器加一。
以下是一个示例,演示了如何使用信号量来控制多个线程对共享资源的访问:
import threading
import time
class Account:
"""银行账户类"""
def __init__(self, balance):
self._balance = balance
self._semaphore = threading.Semaphore()
def withdraw(self, amount):
"""取钱"""
self._semaphore.acquire()
if amount > self._balance:
print("Insufficient balance")
else:
self._balance -= amount
print("Withdraw %d, balance %d" % (amount, self._balance))
self._semaphore.release()
def withdraw(account, amount):
"""取钱线程函数"""
account.withdraw(amount)
time.sleep(1)
# 创建账户对象
account = Account(1000)
# 创建多个线程并启动它们
threads = []
for i in range(5):
t = threading.Thread(target=withdraw, args=(account, 100))
threads.append(t)
t.start()
# 等待线程结束
for t in threads:
t.join()
在上面的代码中,我们定义了一个银行账户类 Account,它包含一个余额和一个信号量。然后,我们创建了多个线程,并将银行账户对象和取款金额作为参数传递给它们的线程函数。取款线程使用 withdraw() 方法从账户中取出一定金额,并使用信号量控制对共享资源的访问。最后,我们使用 join() 方法等待线程结束。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。