• python语法基础-并发编程-线程-其他


    ###############   信号量和事件   ##############

    # 信号量
    # 信号量就是控制只能有n个线程能访问这段代码
    
    # from threading import Semaphore,Thread
    # import time
    # def func(sem,a,b):
    #     sem.acquire()
    #     time.sleep(1)
    #     print(a+b)
    #     sem.release()
    #
    # sem = Semaphore(4)
    # for i in range(10):
    #     t = Thread(target=func,args=(sem,i,i+5))
    #     t.start()
    
    
    # 事件:
    # 事件被创建的时候是false状态,这个false状态会导致wait被阻塞,
    # true状态的时候,wait就不阻塞了
    # clear,设置为false
    # set,设置状态未false,
    # 上次举例的是红绿灯的例子,
    
    
    # 现在我们举一个例子,检测数据库的可连接情况
    # 启动两个线程,
    # 第一个线程连接数据库,
    # 等待一个信号,告诉我们之间的网络是通的
    # 第二个线程,检测和数据自己之间的网络是否是通的
    # 通了之后把事件的状态改为true,
    
    
    import time,random
    from threading import Thread,Event
    def connect_db(e):
        count = 0
        while count < 3:
            # e.wait()  # 这个是一直等待,这种比较浪费资源,
            e.wait(0.1)  # 这是我只等待1秒,否则我就不等你了,# 但是我应该有一个重连的过程,比如三次,三次都连接不上,就断掉了
            if e.is_set() == True:
                print("连接数据库")
                break
            else:
                print("连接失败")
                count += 1
        else:
            raise TimeoutError("数据库连接超时")  # 主动报异常
    
    
    def check_web(e):
        time.sleep(random.randint(0,2))
        e.set()
    
    e = Event()
    t1 = Thread(target=connect_db,args=(e,))
    t2 = Thread(target=check_web,args=(e,))
    t1.start()
    t2.start()

    ###############  线程的条件和定时器    ##############

    # 条件
    from threading import Condition,Thread,Timer
    
    # 可以把条件视为一个更加复杂的锁
    # 同时也有两个方法,acquire,release
    # 一个条件被创建,默认也是一个false状态,会影响wait处于等待状态
    # notify(int),这是制造钥匙,参数是制造多少把钥匙
    # 这个几乎就是只会出现在面试里面,平时基本不会用到,
    #
    # def func(con,i):
    #     con.acquire()
    #     con.wait()  # 在等待钥匙,
    #     print("在第%s个循环里"%i)
    #     con.release()
    #
    #
    # con = Condition()
    # for i in range(10):
    #     Thread(target=func,args=(con,i)).start()
    #
    #
    # while True:
    #     num = int(input(">>>"))
    #     con.acquire()
    #     con.notify(num)  # 制造钥匙,
    #     con.release()
    
    
    
    # 定时器:
    def func():
        print("时间同步")
    
    
    Timer(2,func).start()  # 等待两秒钟开启一个线程,
  • 相关阅读:
    Abp集成Swagger的最佳实践
    ELK 集中日志分析 windows部署实战
    nuget国内镜像的解决办法
    nginx+Memcached 缓存设计
    OpenSSL windows 下编译
    HTTPS 双向认证构建移动设备安全体系
    ASP.NET vNext on CentOS 7
    XF custom render 各平台实现类
    Xamarin.Forms 简介
    【开篇】认识网络和传输,架构
  • 原文地址:https://www.cnblogs.com/andy0816/p/12381478.html
Copyright © 2020-2023  润新知