python高级学习第四课(寒假)2022-1-9

python高级学习第四课(寒假)2022-1-9,第1张

python高级学习第四课(寒假)2022-1-9 学习笔记一:信号量

线程同时运行,能提高程序的运行效率,但是并非线程越多越好,而semaphore信号量可以通过内置计数器来控制同时运行线程的数量,启动线程(消耗信号量)内置计数器会自动减一,线程结束(释放信号量)内置计数器会自动加一;内置计数器为零,启动线程会阻塞,直到有本线程结束或者其他线程结束为止。

semaphore信号量相关函数介绍

acquire() — 消耗信号量,内置计数器减一;

release() — 释放信号量,内置计数器加一;

在semaphore信号量有一个内置计数器,控制线程的数量,acquire()会消耗信号量,计数器会自动减一;release()会释放信号量,计数器会自动加一;当计数器为零时,acquire()调用被阻塞,直到release()释放信号量为止。

按步骤解释信号量的使用:

# 导入线程模块
import threading
# 导入时间模块
import time
class Mythread(threading.Thread):
    def __init__(self,num):
        super(Mythread, self).__init__()
        self.num=num
    def run(self):
        if semaphore.acquire():#计时器获取信号(数)量,相当于加上了一把锁
            print("线程",self.num)
            time.sleep(1)
            semaphore.release()#五个信号量同时释放


if __name__=="__main__":#主线程
    semaphore=threading.Semaphore(5)#添加一个计数器,最大并发线程数量5(最多同时运行5个线程)
    all_thread=[]#创建一个列表
    for i in range(100):
        all_thread.append(Mythread (str(i)))#把每次建立的线程存到列表里
    for j in all_thread:#以列表为原始循环,一个一个取出来
        j.start()
学习笔记二:条件变量

python 条件变量Condition也需要关联互斥锁,同时Condition自身提供了wait/notify/notifyAll方法,用于阻塞/通知其他并行线程,可以访问共享资源了。可以这么理解:Condition提供了一种多线程通信机制,假如线程1需要数据,那么线程1就阻塞等待,这时线程2就去制造数据,线程2制造好数据后,通知线程1可以去取数据了,然后线程1去获取数据。

按步骤解释条件变量的使用:
# 导入线程模块
import threading
 
# 创建条件变量condition
con = threading.Condition()
 
def thread_one(name):
 # 条件变量condition 线程上锁
 con.acquire()
 
 print("")
 # 唤醒正在等待(wait)的线程
 con.notify()
 
 # 等待对方回应消息,使用wait阻塞线程,等待对方通过notify唤醒本线程
 con.wait()
 print("")
 # 唤醒对方
 con.notify()
 
 # 等待消息答应
 con.wait()
 print("")
 # 唤醒对方
 con.notify()
 
 # 等待消息答应
 con.wait()
 print("")
 # 唤醒对方
 con.notify()
 
 # 条件变量condition 线程释放锁
 con.release()

#def thread_one(name):与一类似
 
 
if __name__ == "__main__":
 
 # 创建并初始化线程
 t1 = threading.Thread(target=thread_one,args=("A"))
 t2 = threading.Thread(target=thread_two,args=("B"))
 
 # 启动线程 -- 注意线程启动顺序,启动顺序很重要
 t2.start()
 t1.start()
 
 # 阻塞主线程,等待子线程结束
 t1.join()
 t2.join()
 
 
 print("程序结束!")
学习笔记三:事件

一个线程发出事件信号,而其他线程等待该信号。

按步骤解释事件的使用:

import threading
import time
class examine(threading.Thread):
    def __init__(self,time):
        super(examine, self).__init__()
        self.time=time
    def run(self):
        while True:
            print(time.strftime("%H:%M:%S", time.localtime()))  # 格式化输出当前的时分秒
            time.sleep(3)  # 输出的间隔时间为3秒
            if event.is_set():#设置一个方法,接受当前的事件,作为触发事件的对象
                print("")
            else:
                print("")
                event.wait()
class set_event(threading.Thread):
    def __init__(self):
        super(set_event, self).__init__()
    def run(self):
        while True:
            event.set()#设置事件
            time.sleep(1)  # #休眠一秒
            event.clear()  # 清除事件
            time.sleep(1)  # 在休眠一秒后进入下一个循环

if __name__=="__main__":
    event=threading.Event()
    examine=examine(str(time.localtime()))
    set_event_=set_event()
    examine.start()      #启动线程
    set_event_.start()

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5701132.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存