***************************************************************************************模型--蹲坑(Semaphore)**********************************************************************
import threading
import timeimport random'''
--------------------- 先是判断,如果没有加锁然后设置了超时时间,抛出ValueError;循环,如果value == 0,没有加锁或在超时时间内,跳出循环; 否则,调用Condition变量wait函数等待通知或超时;如果value不为0,跳出循环执行else里的代码,信号量-1,rc = ture, 代表可以调用release函数,最后返回rc;信号量+1,然后调用Condition变量的notify唤醒一个线程~剩下的_enter_和_exit_就不用说了,重写这两个方法就能直接用with关键字了'''s = threading.Semaphore(5) # 粪坑class Human(threading.Thread):
def run(self): #with s: s.acquire() # 占坑 print("拉屎拉屎 - " + self.name + " - " + str(time.ctime())) time.sleep(random.randrange(1, 3)) print("拉完走人 - " + self.name + " - " + str(time.ctime())) s.release() # 走人 if __name__ == '__main__': for i in range(10): human = Human() human.start()*****************************************************************模型--公司旅游(Barrier)*****************************************************************************************************
import threading
import timeimport random'''
---------------------BrokenBarrierError:RuntimeError的子类,当栅栏被reset()或broken时引发;
例子:公司一起去旅游
'''class Staff(threading.Thread): def __init__(self, barriers): #threading.Thread.__init__(self) super().__init__() self.barriers = barriersdef run(self):
print("员工 【" + self.name + "】" + "出门") time.sleep(random.randrange(1, 10)) print("员工 【" + self.name + "】" + "已签到") self.barriers.wait()def ready():
print(threading.current_thread().name + ":人齐,出发,出发~~~") if __name__ == '__main__': print("要出去旅游啦,大家快集合~") #barrier屏障 b = threading.Barrier(10, action=ready, timeout=20) for i in range(10): staff = Staff(b) staff.start()********************************************************************模型--红绿灯(Event)*********************************************************************************************
import threading
import timeimport random'''
---------------------判断标志是否为False,False的话进入堵塞状态,(⊙v⊙)嗯
源码就那么简单,感觉看完还是蒙圈不知道怎么用,写个简单的例子? 汽车过红绿灯的例子'''class CarThread(threading.Thread): def __init__(self, event): threading.Thread.__init__(self) self.threadEvent = eventdef run(self):
# 休眠模拟汽车先后到达路口时间 time.sleep(random.randrange(1, 10)) print("汽车 - " + self.name + " - 到达路口...") self.threadEvent.wait() print("汽车 - " + self.name + " - 通过路口...") if __name__ == '__main__': light_event = threading.Event()# 假设有20台车子
for i in range(20): car = CarThread(event=light_event) car.start()while threading.active_count() > 1:
light_event.clear() print("红灯等待...") time.sleep(3) print("绿灯通行...") light_event.set() time.sleep(2)*****************************************************************************************模型--生产者消费者(Condition)************************************************************************************************
# -*- coding:utf-8 -*-
import threadingimport time'''
Condition(条件变量)除了提供与Lock类似的acquire()与release()函数外,还提供了 wait()与notify()函数1.调用threading.Condition获得一个条件变量对象;2.线程调用acquire获得Condition对象;3.进行条件判断,不满足条件调用wait函数,满足条件,进行一些处理改变 条件后,调用notify函数通知处于wait状态的线程,重新进行条件判断。'''num = 0
con = threading.Condition()class Producer(threading.Thread):
"""生产者""" def run(self): global num # 获取锁 con.acquire() while True: num += 1 print('生产了1个,现在有{0}个'.format(num)) time.sleep(1) if num >= 5: print('已达到5个,不再生产') # 唤醒消费者 con.notify() # 等待-释放锁;被唤醒-获取锁 con.wait() # 释放锁 print('Producer释放锁')#没执行 con.release() class Customer(threading.Thread): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.money = 7def run(self):
global num while self.money > 0: # 由于场景是多个消费者进行抢购,如果将获取锁操作放在循环外(如生产者), # 那么一个消费者线程被唤醒时会锁住整个循环,无法实现另一个消费者的抢购。 # 在循环中添加一套"获取锁-释放锁",一个消费者购买完成后释放锁,其他消费者 # 就可以获取锁来参与购买。 con.acquire() if num <= 0: print('没货了,{0}通知生产者'.format(self.name)) #唤醒生产者 con.notify() #等待 con.wait() self.money -= 1 num -= 1 print('{0}消费了1个, 剩余{1}个'.format( threading.current_thread().name, num)) time.sleep(1) con.release() time.sleep(1) print('{0}没钱了-回老家'.format(threading.current_thread().name))
if __name__ == '__main__':
p = Producer(daemon=True) c1 = Customer(name='Customer-1') c2 = Customer(name='Customer-2') p.start() c1.start() c2.start() c1.join() c2.join()*****************************************************************************模型--时间(Timer)*************************************************************************************
import threading
import time def skill_ready(): print("!!!!!!大招已经准备好了!!!!!!") if __name__ == '__main__': t = threading.Timer(5, skill_ready) t.start() while threading.active_count() > 1: print("======大招蓄力中======") time.sleep(1)