信号量
队列是数据传递、信号量是类似于锁(共享内存)
Semaphore管理一个内置的计数器,
每当调用acquire()时内置计数器-1;
调用release() 时内置计数器+1;
计数器不能小于0;当计数器为0时,acquire()将阻塞线程直到其他线程调用release()。
from threading import Thread
from threading import Semaphore # 信号
from threading import currentThread # 获取线程对象
import time,random
sm = Semaphore(3) # 设置三个坑位
def talk():
with sm:
print('%s in' % currentThread().getName())
time.sleep(random.randint(1,3)) # 随即取一个休息时间
if __name__ == '__main__':
for i in range(10): # 启动10个线程
t = Thread(target=talk)
t.start()
Event 事件
from threading import Event
event.isSet():返回event的状态值;
event.wait():如果 event.isSet()==False将阻塞线程;
event.set(): 设置event的状态值为True,所有阻塞池的线程激活进入就绪状态, 等待操作系统调度;
event.clear():恢复event的状态值为False。
from threading import Thread, Event
import time
# 作用 一个线程通知另外一个线程可以执行后面代码了
event = Event()
def student(name):
print('学生%s 正在听课' % name)
event.wait() # 可以带参数 单位:秒 可以等到时间直接运行
print('学生%s 课间活动' % name)
def teacher(name):
print('老师 %s 正在上课' % name)
time.sleep(7)
event.set()
if __name__ == '__main__':
s1 = Thread(target=student, args=('学生1',))
s2 = Thread(target=student, args=('学 生2',))
t1 = Thread(target=teacher, args=('老师1',))
t2 = Thread(target=teacher, args=('老师2',))
s1.start()
s2.start()
t1.start()
t2.start()
定时器
from threading import Timer
def hello():
print("hello, world")
t = Timer(1, hello) # 参数1:等待时间 参数2:执行方法
t.start()
定时器案例【验证码生成与验证】
from threading import Timer # 定时器
import random
# 定时器就是一个线程
class Code: # 验证码
def __init__(self):
self.make_cache()
def make_cache(self, interval=3): # 默认10秒钟刷新验证码 获取验证码缓存
self.cache = self.make_code() # 当前验证码
print(self.cache)
self.timer = Timer(interval, self.make_cache) # 制作定时器,参数2为函数名
self.timer.start() # 开始定时
def make_code(self, n=4): # 造出4位验证码并返回
res = ''
for i in range(n):
s1 = str(random.randint(0,9))
s2 = chr(random.randint(65,90))
res += random.choice([s1,s2])
return res
def check(self):
while True:
code = input('请输入验证码>>').strip()
if code.upper() == self.cache:
print('输入正确')
self.timer.cancel()
break
obj = Code()
obj.check()
队列
- 数据进出储存与获取
import queue # 线程列队
q = queue.Queue(3) # 数据先进先出
q.put('first')
q.put(2)
q.put('third')
q = queue.LifoQueue(3) # 后进显出 = 堆栈
q.put('first')
q.put(2)
q.put('third')
q = queue.PriorityQueue(3) # 优先级队列
# 传参数的时候,元祖形式 参数1:优先级 (数字小优先级高) 参数2:数据
q.put((10,'one'))
q.put((2,'two'))