开发者学堂课程【Python入门 2020年版:队列的使用】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/639/detail/10474
队列的使用
内容介绍
一、两个类型的q
二、队列的使用
一、有两个类型的q
import multiprocessing, queue
q1=multiprocessing. Queue()
#进程间通信
q2=queue.Queue
#线程间通信
二、队列的使用
1.#创建队列时,可以指定最大长度,默认值是0,表示不限
代码:
q=multiprocessing. Queue(5)
q.put(
‘hello’)
q.put(
‘good’)
q.put(
‘yes’)
q.put(
‘ok’)
q.put(
‘hi’)
运行时没有报错,直接放进去了。
2.再加一个q.put(‘how’)
q.put(
‘how’)
#无法放进去
运行没有结束,但是长度是5,q.put(‘how’)
就放不进去了,它是阻塞的,在等待,等到有一个数据取出去了。要有个多任务来处理,再有个进程往外取。
3.print(q.full())
代码:
q=multiprocessing. Queue(5)
q.put(
‘hello’)
q.put(
‘good’)
q.put(
‘yes’)
q.put(
‘ok’)
q.put(‘hi’)
print(q.full())
#判断是否满了
运行结果:True
4.block=True
如果往队列里放how
block=True
:表示是阻塞,如果队列已经满了,就等待。
5.time.out
表示超时,等待多久以后程序会出错,单位是秒。
代码:
q=multiprocessing. Queue(5)
q.put(
‘hello’)
q.put(
‘good’)
q.put(
‘yes’)
q.put(
‘ok’)
q.put(
‘hi’)
q.put(
‘how’,block=True, timeout=5)
运行结果:等了一会,放不进去就会崩。
6.q.put_nowait(
‘how’)
#等价于q.put(‘how’,block=False)
Block=False
就是不再等待,放不进去就崩。
7.print(q.get())
就是拿出来
代码:
q=multiprocessing. Queue(5)
q.put(
‘hello’)
q.put(
‘good’)
q.put(
‘yes’)
q.put(
‘ok’)
q.put(
‘hi’)
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
运行结果:
hello
good
yes
ok
hi
现在拿完了再拿,再加一个print(q.get())
,运行结果同上但最后一个拿不到了,但是代码没有停,它也是阻塞的。就像是去面包店买面包,卖到第十个卖完了,你是第十一个,你在那等。
8.get也能设置超时
代码:
q=multiprocessing. Queue(5)
q.put(
‘hello’)
q.put(
‘good’)
q.put(
‘yes’)
q.put(
‘ok’)
q.put(
‘hi’)
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
q.get(block=True, timeout=10)
运行结果:拿到了前五个,但是再等10s没拿到就会报错,出现 Empty 的错误。
9. q.get_nowait()
代码:
q=multiprocessing. Queue(5)
q.put(
‘hello’)
q.put(
‘good’)
q.put(
‘yes’)
q.put(
‘ok’)
q.put(
‘hi’)
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
q.get_nowait()
运行结果:取完hello、good、yes、ok、hi后立马崩。
一般情况下,队列里拿东西就用get,一边放一边拿要用多任务,多进程或多线程。这些都作为底层知识来了解,包括接下来讲的服务器手写,大家到时候会觉得有些难,但是以后写服务器都是会用框架写的,不可能手写。