python多线程系列—信号量(七)

一、信号量的作用

1、信号量也是一种锁,主要用在保护有限的资源,常在多线程中控制获取资源的线程数量

二、信号量原理

1、Semaphore是一个工厂函数,负责返回一个新的信号量对象。
2、Semaphore内部维护一个计数器,该计数器的值= 初始值+release-acquare的值。
3、每次调用acquare方法都会使内部计数器减一,一旦计数器为负的,则acquare方法会被阻塞,直到其他线程调用release方法,使信号量内部计数器值为正。 计数器初始值为1。

三、常用方法:

1、 sem = threading.Semaphore(n) 设置最多同时启动线程数量
2、 sem.acquire() 每启动一个线程,可用线程数量就会减1
3、 sem.release() 完成后,就释放,可用线程数加1
4、bar = threading.Barrier(n) 凑够多少个才执行

四、代码举例

写一个for循环不段创建线程,通过信号量保证每次执行有5个线程同时运行
import threading
import time
import traceback

class Demo(threading.Thread):
    def __init__(self, sem):
        super().__init__()
        self.sem = sem

    def run(self):
        try:
            #每启动一个线程,可用线程数量就会减1
            self.sem.acquire()
            print("{}线程启动.....".format(self.getName()))
            time.sleep(2)
            #完成后,就释放,可用线程数加1
            self.sem.release()
            print("{}线程释放成功".format(self.getName()))
        except Exception as e:
            print(e, traceback.print_exc())
if __name__ == '__main__':
    sem = threading.Semaphore(5)  # 同时启动多少个线程
    while True:
        th=Demo(sem=sem)
        th.start()

五、代码举例

bar = threading.Barrier(n) 凑够多少个才执行
import threading
class Demo(threading.Thread):
    def __init__(self, barrier):
        super().__init__()
        self.barrier = barrier

    def run(self):
        print("{}只启动三个线程.....".format(self.getName()))
        self.barrier.wait()
        print("凑够3个线程再执行self.barrier.wait()方法之后的代码,否则会一直阻塞;")

if __name__ == '__main__':
    #设置信号量为3
    barrier = threading.Barrier(3)
    for i in range(5):
        th = Demo(barrier=barrier)
        th.start()
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PyQt是一个Python的GUI编程工具包,它提供了丰富的功能和组件来创建图形用户界面。在PyQt中,多线程信号量可以用来实现并发执行和线程间的通信。 多线程是指在一个程序中同时执行多个线程,每个线程都可以独立执行不同的任务。在PyQt中,可以使用QThread类来创建和管理多线程。通过继承QThread类,并重写其run()方法,可以实现自定义的线程逻辑。在多线程中,需要注意线程间的数据共享和同步问题,可以使用信号量来进行线程间的通信和同步。 信号量是一种用于控制并发访问资源的机制。在PyQt中,可以使用QSemaphore类来创建和管理信号量。通过调用QSemaphore的acquire()方法可以获取一个信号量,如果当前信号量的值大于0,则减少信号量的值并继续执行;如果当前信号量的值为0,则阻塞线程直到有可用的信号量。通过调用QSemaphore的release()方法可以释放一个信号量,增加信号量的值。 下面是一个简单的示例代码,演示了如何在PyQt中使用多线程信号量: ```python from PyQt5.QtCore import QThread, QSemaphore class WorkerThread(QThread): def __init__(self, semaphore): super().__init__() self.semaphore = semaphore def run(self): self.semaphore.acquire() # 获取信号量 # 执行线程逻辑 print("Thread started") # 释放信号量 self.semaphore.release() # 创建一个信号量,初始值为1 semaphore = QSemaphore(1) # 创建并启动线程 thread = WorkerThread(semaphore) thread.start() # 等待线程执行完毕 thread.wait() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值