线程的队列,条件,定时器

线程的队列,条件,定时器

一、队列

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
休息中......
'''
posted @ 2019-09-18 21:39  SweetJack  阅读(150)  评论(0编辑  收藏  举报