前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python线程-线程的同步(三)

Python线程-线程的同步(三)

原创
作者头像
玖叁叁
发布2023-04-20 09:02:09
4700
发布2023-04-20 09:02:09
举报
文章被收录于专栏:玖叁叁

信号量(Semaphore)

信号量是一种允许多个线程同时访问共享资源的同步机制。在 Python 中,可以使用 threading.Semaphore 类来创建一个信号量。信号量有两个操作:acquire() 和 release()。acquire() 方法用于获取信号量,如果信号量的计数器为零,则线程将被阻塞,直到有一个线程释放信号量;release() 方法用于释放信号量,使计数器加一。

以下是一个示例,演示了如何使用信号量来控制多个线程对共享资源的访问:

代码语言:javascript
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 信号量(Semaphore)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档