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是不会造成阻塞的。

知识扩展

信号量会导致死锁的发生

posted @ 2021-01-14 12:33  Throokie  阅读(85)  评论(0编辑  收藏  举报