线程的队列,条件,定时器
一、队列
queue队列 :使用import queue
,用法与进程Queue
一样
队列中封装了很多的锁,所以对于线程,队列绝对安全
普通队列(先进先出)
q = queue.Queue()
q.put()
q.get()
q.put_nowait()
q.get_nowait()
栈(先进后出,后进先出)
q = queue.LifoQueue()
q.put(1)
q.put(2)
q.put(3)
print(q.get())
print(q.get())
'''
3
2
'''
优先级队列
q = queue.PriorityQueue()
q.put((1,'a'))
q.put((15,'b'))
q.put((10,'c'))
q.put((3,'d'))
q.put((1,'f'))
print(q.get())
print(q.get())
print(q.get())
'''
(1, 'a')
(1, 'f')
(3, 'd')
参数已元组形式存放
第一个是优先级
数字越小,优先级越高
优先级相同,按ascii码比较
第二个是加入队列的内容
'''
二、条件
- 条件也是锁
- 也有acquire和release
- 一个条件被创建,默认有一个False状态
- False状态会影响wait一直处于等待状态
- notify(int数据类型) 指定造钥匙的数量
- notify和wait必须在acquire和release之间
from threading import Thread,Condition
con = Condition()
def func(con,i):
con.acquire()
con.wait() # 等钥匙 阻塞
print(f'我在第{i}个线程里')
con.release()
# 创建线程
s = 10
for i in range(s):
Thread(target=func,args=(con,i)).start()
# 循环造钥匙,超过线程总数便停止
while True:
num = int(input('>>>>>>>'))
import time
con.acquire()
con.notify(num) # 造钥匙
con.release()
time.sleep(0.5)
'''
>>>>>>>3
我在第1个线程里
我在第0个线程里
我在第2个线程里
>>>>>>>4
我在第6个线程里
我在第4个线程里
我在第5个线程里
我在第3个线程里
>>>>>>>5
我在第9个线程里
我在第8个线程里
我在第7个线程里
>>>>>>>2
>>>>>>>
'''
三、定时器
给线程的开启加了定时器,限定线程在指定时间后开启
from threading import Timer
import datetime
import time
def func():
print(datetime.datetime.now())
while True:
Timer(2,func).start() # 让创建的线程间隔一段时间才执行
print('休息中......')
time.sleep(2)
'''
休息中......
2019-09-18 20:55:25.158692
休息中......
2019-09-18 20:55:27.158931
休息中......
2019-09-18 20:55:29.159125
休息中......
'''