python网络编程之线程队列(queue)

多线程利器——队列(queue)

首先来看一个示例:

import threading
import time

li = [1,2,3,4,5]

def pri():
    while li:
        a = li[-1]
        print(a)
        time.sleep(1)
        try:
            li.remove(a)
        except Exception as e:
            print('------',a,e)

t1 = threading.Thread(target=pri)
t1.start()
t2 = threading.Thread(target=pri)
t2.start()

运行结果:
5
5
4
—— 5 list.remove(x): x not in list
4
3
—— 4 list.remove(x): x not in list
3
2
—— 3 list.remove(x): x not in list
2
1
—— 2 list.remove(x): x not in list
1
—— 1 list.remove(x): x not in list
上面的示例说明了一个问题,在多线程中列表是不安全的,当然解决这个问题也可以通过加锁来实现,但如果不用锁,该怎么办呢?这时候就用到了队列的概念。

多线程队列:

import queue  #线程队列

l = []
q = queue.Queue(3)# FIFO
q.put(11)
q.put('hello')
q.put({'name':'huang'})
q.put(34)
while 1:
    data = q.get()
    print(data)

运行结果:
11
hello
{‘name’: ‘huang’}
队列有三种形式,默认是先进先出,就像上面一样。

队列(先进后出):

#先进后出LIFO
import queue
q = queue.LifoQueue()
q.put(11)
q.put('hello')
q.put({'name':'huang'})
q.put(34)
while 1:
    data = q.get()
    print(data)

运行结果:
34
{‘name’: ‘huang’}
hello
11

队列(优先级):

#优先级
import queue
q = queue.PriorityQueue()
q.put([3,11])
q.put([2,'hello'])
q.put([4,{'name':'huang'}])

while 1:
    data = q.get()
    print(data)

运行结果:
[2, ‘hello’]
[3, 11]
[4, {‘name’: ‘huang’}]

猜你喜欢

转载自blog.csdn.net/huang_yong_peng/article/details/81915751