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

一笑奈何 提交于 2020-02-29 08:55:00

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

# 信号量
# 信号量就是控制只能有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()  # 等待两秒钟开启一个线程,

 

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!