Python线程——信号量(Semaphore)、队列(Queue)

信号量(Semaphore)

之前讲的线程锁(互斥锁)同时只允许一个线程更改数据,而Semaphore是同时允许一定数量的线程更改数据 ,比如厕所有4个坑,那最多只允许4个人上厕所,后面的人只能等里面有人出来了才能再进去。 说白了就是在同一时间,可以只允许设定的数量的线程去执行 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import time
from threading import Semaphore, Thread


def func(sem, a, b):
sem.acquire()
time.sleep(1)
print(a + b)
sem.release()


sem = Semaphore(4)
for i in range(10):
t = Thread(target=func, args=(sem, i, i + 5))
t.start()

队列(Queue)

queue队列 :使用import queue,用法与进程Queue一样

####class queue.Queue(maxsize=0) 先进先出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import queue

q=queue.Queue()
q.put('first')
q.put('second')
q.put('third')

print(q.get())
print(q.get())
print(q.get())

# 执行结果
结果(先进先出):
first
second
third

class queue.LifoQueue(maxsize=0) 后进先出

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import queue

q=queue.LifoQueue()
q.put('first')
q.put('second')
q.put('third')

print(q.get())
print(q.get())
print(q.get())

# 执行结果
结果(后进先出):
third
second
first

class queue.PriorityQueue(maxsize=0)

根据优先级来取数据。存放数据的格式 : Queue.put((priority_number,data)),priority_number越小,优先级越高,data代表存入的值

1
2
3
4
5
6
7
8
9
10
11
12
13
import queue
q = queue.PriorityQueue()
q.put((1, "d1"))
q.put((-1, "d2"))
q.put((6, "d3"))
print(q.get())
print(q.get())
print(q.get())

#执行结果
(-1, 'd2')
(1, 'd1')
(6, 'd3')

注意:maxsize代表这个队列最大能够put的长度

-------------本文结束感谢您的阅读-------------

本文标题:Python线程——信号量(Semaphore)、队列(Queue)

文章作者:GavinLiu

发布时间:2018年03月07日 - 23:03

最后更新:2018年03月08日 - 23:03

原始链接:http://gavinliu4011.github.io/post/d068a68c.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

请博主吃个鸡腿吧
0%