列表数据结构,多线程不安全
import threading, time
li = [1, 2, 3, 4, 5]
def r():
while li:
v = li[-1]
print(v)
time.sleep(0.1)
li.remove(v)
if __name__ == '__main__':
t1 = threading.Thread(target=r)
t2 = threading.Thread(target=r)
t1.start()
t2.start()
FIFO先进先出
import queue # 线程队列
l = []
# FIFO先进先出
q = queue.Queue(3)
q.put(12)
q.put('hello')
q.put({'name': 'zhang'})
while 1:
data = q.get()
print(data)
print('------')
后进先出
先进后出
import queue
q = queue.LifoQueue()
q.put(12)
q.put('hello')
q.put({'name': 'zhang'})
while True:
data = q.get()
print(data)
print('---')
优先级
import queue
q = queue.PriorityQueue()
q.put([2, 12])
q.put([4, 'hello'])
q.put([3, {'name': 'zhang'}])
while True:
data = q.get()
print(data[1])
print('---')
常用方法
q = Queue.Queue()
q.qsize() 返回队列的大小
q.empty() 如果队列为空,返回True,反之False
q.full() 如果队列满了,返回True,反之False
q.full 与 maxsize 大小对应
q.get([block[, timeout]]) 获取队列,timeout等待时间
q.get_nowait(item) 相当于 q.get(False)
非阻塞 q.put(item) 写入队列,timeout等待时间
q.put_nowait(item) 相当于 q.put(item, False)
q.task_done() 在完成一项工作之后,q.task_done() 函数向任务已经完成的队列发送一个信号
q.join() 实际上意味着等到队列为空,再执行别的操作