zoukankan      html  css  js  c++  java
  • 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是不会造成阻塞的。

    知识扩展

    信号量会导致死锁的发生

  • 相关阅读:
    istio 配置解读
    docker 不同版本 添加--insecure-registry
    Ingress 暴露tcp端口
    jenkins 调用 k8s api
    十五项指标衡量DevOps是否成功
    关于使用镜像仓库的思考
    Jenkins pipeline:pipeline 语法详解
    lvm xfs 扩容
    看到了一个pipeline例子,
    私有仓库harbor安装包括https
  • 原文地址:https://www.cnblogs.com/beidaxmf/p/14276565.html
Copyright © 2011-2022 走看看