Python高级学习第四课 2022-1-8

信号量:

信号量是用来控制线程并发数的一内置计数器,每当调用acquire()时-1,调用release时+1,计数器不能小于0。semaphore=threading.Semaphore(n) #设置信号量为n  可以理解为同时有n个线程进行同一个数据

"""信号量"""
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(3)
    all_thread = []
    for i in range(10):
        all_thread.append(Mythread(str(i)))
    for j in all_thread:
        j.start()

条件变量:

条件变量可以再一个线程没有进行完的时候就可以进行下一个,而线程锁是在第一个运行完之后,再运行第二个,以此类推。两者对比之后更易理解

import threading
import time

def run(x):
    # lock.acquire()
    con.acquire()
    print(f'线程{x}')
    con.notify() #该方法是告诉con.wait()等待结束,继续下面的线程
    print(f'线程{x}挂起')
    con.wait() #等待
    time.sleep(1)
    print(f'线程{x}再次启动')
    con.notify()
    con.release()
    # lock.releave()
#线程锁是在第一个运行完之后,再运行第二个,以此类推
#条件变量可以再一个线程没有进行完的时候就可以进行下一个
if __name__ == '__main__':
    # lock = threading.Lock
    con=threading.Condition()
    # for i in range(50):
    #     t = threading.Thread(target=run,args=(i,))
    #     t.start()
    t1 = threading.Thread(target=run,args=(1,))
    t1.start()
    t2 = threading.Thread(target=run,args=(2,))
    t2.start()

事件:

event事件就是程序上发生的事。例如用户敲击键盘上的某一个键或是点击移动鼠标。而对于这些事件,程序需要做出反应。

import threading
import time

def car():
    while True:
        if event.is_set():
            print("小车行驶")
        else:
            print("小车停止")
            event.wait()

def set_event():
    while True:
        event.set()
        time.sleep(1)
        event.clear()
        time.sleep(1)




if __name__ == '__main__':
    event = threading.Event()
    car1 = threading.Thread(target=car)
    car1.start()
    set_e = threading.Thread(target=set_event)
    set_e.start()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值