threading模型

***************************************************************************************模型--蹲坑(Semaphore)**********************************************************************

import threading
import time
import 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 time
import random

'''
---------------------

BrokenBarrierError:RuntimeError的子类,当栅栏被reset()或broken时引发;

例子:公司一起去旅游
'''
class Staff(threading.Thread):
def __init__(self, barriers):
#threading.Thread.__init__(self)
super().__init__()
self.barriers = barriers

def 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 time
import random

'''
---------------------

判断标志是否为False,False的话进入堵塞状态,(⊙v⊙)嗯
源码就那么简单,感觉看完还是蒙圈不知道怎么用,写个简单的例子?
汽车过红绿灯的例子
'''
class CarThread(threading.Thread):
def __init__(self, event):
threading.Thread.__init__(self)
self.threadEvent = event

def 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 threading
import 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 = 7

def 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)

原文地址:https://www.cnblogs.com/cwx-0324/p/10194250.html