python多线程2 信号量Semaphore,条件变量同步Condition,同步条件event,队列queue

信号量Semaphore

本质是锁,用来控制线程并发数,BoundedSemaphore或Semaphore管理一个内置的计数器,每当调用acquire()时-1,调用release()时+1.

计数器不能小于0,当计数器小于0时,acquire()将阻塞线程到同步锁状态,直到其他线程用release()

BoundedSemaphore与Semaphore的唯一区别在于前者将在调用release()时会检查计数器的值是否超过了计数器的初始值,如果超过了,就抛出一异常。

信号量与递归锁RLock在涉及到的多把锁问题上,不同之处在于递归锁是嵌套锁,而信号量是并行的锁,当然由于python的GIL存在,这里的并行锁其实是伪并行

#简单的用法示例
import threading,time
class my_thread(threading.Thread):
	def run(self):
		if semaphore.acquire():#加锁
			print(self.name)
			time.sleep(1)
			semaphore.release()#解锁
if __name__ == '__main__':
	semaphore = threading.Semaphore(5)#创建锁对象,二者都可以
	#semaphore = threading.BoundedSemaphore(5)
	thrs = []
	for i in range(100):
		thrs.append(my_thread())
	for t in thrs:
		t.start()

条件变量同步

本质是锁,可以实现线程间的通信。

在运用多线程时,很多时候我们都会想让不同线程间能够进行一个先后的顺序,类似于线程1创造好条件后,通知线程2不再阻塞,可以继续运行了,为了实现这一目的,python为我们提供了threading.Condition对象用于条件变量线程的支持,配套的提供了wait(),notify(),notifyall()方法。

lock_con = threading.Condition([Lock/RLock])
#锁是可选选项,如果创建对象的时候,没有传入锁,那么默认是RLock锁
  • wait():条件不满足时调用,线程会释放锁,并进入等待阻塞状态
  • notify():条件创造后调用,通知等待池激活一个线程
  • notifyall():条件创造后调用,通知等待池激活所有线程
#用法简单示例
import threading,time
from random import randint
class producer(threading.Thread):
	def run
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值