python并发——生产者消费者信号量实现
介绍
写扫描器的时候,需要让资产扫描结果一出来(生产者),另外一边就会开个线程去运行漏洞扫描(消费者)。
但是又不能让结果没出来,另外一边消费者就开始干活了。
代码
# *coding:UTF-8 *
import threading
import time
import random
"""
利用方式: 信号量
两个线程分别用一个共同资源,item。
producer是生成item, consumer是消费item。
如果item还未生成,consumer就会等待
如果item生成了,producer就会通知consumer
"""
semaphore = threading.Semaphore(0) #默认赋值为1,这里赋值0
def consumer():
print("consumer is waiting.")
##获取信号量
semaphore.acquire()
##消费者访问共享资源
print(f"消费者: 消耗了{item}")
def producer():
global item
time.sleep(3)
item = random.randint(0,1000)
print(f"生产者: 生产了{item}")
## 等于0时,另一个线程就会再次等待它的值变为大于0,同时唤醒另一个线程
semaphore.release()
if __name__ == '__main__':
for i in range(0,5):
t1 = threading.Thread(target=producer)
t2 = threading.Thread(target=consumer)
t1.start()
t2.start()
t1.join()
t2.join()
print("程序结束!")
运行结果
说明
semaphore 是信号量,内部是个计数器。其值刚刚开始为0。
调用一次release()方法后计数器值加1。然后通知其他线程
调用一次acquire()方法后计数器值减1。如果信号量的值为0,就会阻塞该线程。如果信号量的值大于0,就会令信号量的值减1,如果值不为0是不会造成阻塞的。
知识扩展
信号量会导致死锁的发生
搞CTF