【Python】条件变量、信号变量、事件

条件变量、信号变量、事件

  • 信号量:信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。
    通常sem_post()和sem_wait()函数对信号量进行加减操作从而解决线程的同步和互斥。
相关定义:

数据类型:sem_t

信号量的创建:sem_init()

信号量的销毁:sem_destroy(sem_t* sem, int pshared, unsigned value);

( 第一个参数是信号量指针,第二个参数表示是否在进程间共享的标志,第三个参数表示信号量的初值;)

信号量的加操作:sem_post();(调用一次加1)

信号量的减操作:sem_wait();阻塞版本(调用一次减1)

信号量的减操作:sem_trywait();非阻塞版本

当线程调用sem_wait()后,若信号量的值小于0则线程阻塞。只有其他线程在调用sem_post对信号量作加操作后并且其值大于等于0时,阻塞的线程才能继续运行。

案例:

车站有3个安检口,那么同时只能有3个人安检,别人来了,只能等着别人安检完才可以过。

import threading
import os, time

# 一次只允许3个人同时过安检
semapshore = threading.BoundedSemaphore(3)


def run(num):
    semapshore.acquire()  # 获得信号量的锁
    print(f'第{
     num}个人正在过安检')
    time.sleep(2)
    semapshore.release()  # 释放这把锁


if __name__ == '__main__':
    # 创建子线程
    thread 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
条件变量是一种同步机制,用于线程之间的通信和协调。在 Python 中,条件变量可以用 threading 模块的 Condition 类来实现。 Condition 类有两个主要方法:wait() 和 notify()。wait() 方法用于等待条件变量的发生,如果条件不满足,线程就会阻塞在这里等待。notify() 方法用于通知等待条件变量的线程,让它们继续执行。 下面是一个简单的例子,演示了如何使用条件变量: ```python import threading class SharedCounter: def __init__(self, value=0): self.value = value self.cv = threading.Condition() def increment(self): with self.cv: self.value += 1 self.cv.notify_all() def decrement(self): with self.cv: while self.value == 0: self.cv.wait() self.value -= 1 counter = SharedCounter() def worker(): print('Starting worker') for i in range(10): counter.increment() print('Incremented: {}'.format(counter.value)) print('Exiting worker') threads = [] for i in range(5): t = threading.Thread(target=worker) t.start() threads.append(t) for t in threads: t.join() print('Final value: {}'.format(counter.value)) ``` 在这个例子中,我们创建了一个 SharedCounter 类,它包含一个整数值和一个条件变量。increment() 和 decrement() 方法分别用于增加和减少计数器的值。当计数器的值为 0 时,decrement() 方法会阻塞等待条件变量的发生。当 increment() 方法执行完成后,它会通知所有等待条件变量的线程,让它们继续执行。 我们创建了 5 个线程来同时访问 SharedCounter 对象,并在每个线程中调用 increment() 方法 10 次。由于 increment() 方法使用了条件变量,线程之间可以协调和同步,保证计数器的值始终正确。最后,我们输出了计数器的最终值。 总的来说,条件变量是一种非常有用的同步机制,可以用于解决多线程程序中的一些复杂问题。在 Python 中,使用 threading 模块的 Condition 类来实现条件变量非常简单。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值