Queue的put方法
cat process3.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Queue
q=Queue(5)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
q.put('F') #put(),如果queue满了则只能等待,除非有'空地'则添加成功
执行发现会卡在q.put(‘F’),,这是因为队列满了,一直在等待。
Queue的put方法参数timeout
cat process3.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Queue
q=Queue(5)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
q.put('F',timeout=3) #put(),如果queue满了则只能等待,除非有'空地'则添加成功
python process3.py
5
Traceback (most recent call last):
File "process3.py", line 14, in <module>
q.put('F',timeout=3) #put(),如果queue满了则只能等待,除非有'空地'则添加成功
File "/usr/lib64/python2.7/multiprocessing/queues.py", line 102, in put
raise Full
Queue.Full
Queue的方法full
[root@ceph01 python]# cat process3.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Queue
q=Queue(5)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
if not q.full(): #判断队列是否满 q.empty() 判断队列是否是空的
q.put('F',timeout=3) #put(),如果queue满了则只能等待,除非有'空地'则添加成功
else:
print('队列已满!')
[root@ceph01 python]# python3 process3.py
5
队列已满!
Queue的方法get
cat process3.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Queue
q=Queue(5)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
if not q.full(): #判断队列是否满 q.empty() 判断队列是否是空的
q.put('F',timeout=3) #put(),如果queue满了则只能等待,除非有'空地'则添加成功
else:
print('队列已满!')
#获取队列的值
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
print(q.get())
可以看到卡在了第6个print(q.get()),这是因为队列里只有5个值。
Queue的get方法参数timeout
cat process3.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Queue
q=Queue(5)
q.put('A')
q.put('B')
q.put('C')
q.put('D')
q.put('E')
print(q.qsize())
if not q.full(): #判断队列是否满 q.empty() 判断队列是否是空的
q.put('F',timeout=3) #put(),如果queue满了则只能等待,除非有'空地'则添加成功
else:
print('队列已满!')
#获取队列的值
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
print(q.get(timeout=2))
[root@ceph01 python]# python3 process3.py
5
队列已满!
A
B
C
D
E
Traceback (most recent call last):
File "process3.py", line 26, in <module>
print(q.get(timeout=2))
File "/usr/local/lib/python3.6/multiprocessing/queues.py", line 105, in get
raise Empty
queue.Empty
Queue的get_nowait和get_nowait方法
cat process3.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Queue
q=Queue(5)
q.put_nowait('A')
q.put_nowait('B')
q.put_nowait('C')
q.put_nowait('D')
q.put_nowait('E')
print(q.qsize())
q.put_nowait('F')
#获取队列的值
print(q.get_nowait(timeout=2))
print(q.get_nowait(timeout=2))
print(q.get_nowait(timeout=2))
print(q.get_nowait(timeout=2))
print(q.get_nowait(timeout=2))
print(q.get_nowait(timeout=2))
print(q.get_nowait(timeout=2))
[root@ceph01 python]# python process3.py
5
Traceback (most recent call last):
File "process3.py", line 13, in <module>
q.put_nowait('F')
File "/usr/lib64/python2.7/multiprocessing/queues.py", line 155, in put_nowait
return self.put(obj, False)
File "/usr/lib64/python2.7/multiprocessing/queues.py", line 102, in put
raise Full
Queue.Full
进程通信实战
cat process4.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Process,Queue
from time import sleep
def download(q):
images=['a.jpg','b.jpg','c.jpg']
for image in images:
print('正在下载',image)
sleep(0.5)
q.put(image)
def getfile(q):
file=q.get()
print('{}保存成功!'.format(file))
if __name__ == "__main__":
q=Queue(5)
p1=Process(target=download,args=(q,))
p2=Process(target=getfile,args=(q,))
p1.start()
p2.start()
可以看到在没有download完的时候就已经开始执行getfile,这时可以用join()方法去让进程先执行完一个再执行另一个。
python3 process4.py
正在下载 a.jpg
正在下载 b.jpg
a.jpg保存成功!
正在下载 c.jpg
进程通信实战join()方法应用
cat process4.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Process,Queue
from time import sleep
def download(q):
images=['a.jpg','b.jpg','c.jpg']
for image in images:
print('正在下载',image)
sleep(0.5)
q.put(image)
def getfile(q):
file=q.get_nowait()
print('{}保存成功!'.format(file))
if __name__ == "__main__":
q=Queue(5)
p1=Process(target=download,args=(q,))
p2=Process(target=getfile,args=(q,))
p1.start()
p1.join()
p2.start()
p2.join()
[root@ceph01 python]# python3 process4.py
正在下载 a.jpg
正在下载 b.jpg
正在下载 c.jpg
a.jpg保存成功!
进程间通信代码改进
cat process4.py
#!/usr/bin/env python3
#coding:utf8
from multiprocessing import Process,Queue
from time import sleep
def download(q):
images=['a.jpg','b.jpg','c.jpg']
for image in images:
print('正在下载',image)
sleep(0.5)
q.put(image)
def getfile(q):
while True:
try:
file=q.get_nowait()
print('{}保存成功!'.format(file))
except:
print('全部保存完毕!')
break
if __name__ == "__main__":
q=Queue(5)
p1=Process(target=download,args=(q,))
p2=Process(target=getfile,args=(q,))
p1.start()
p1.join()
p2.start()
p2.join()
[root@ceph01 python]# python3 process4.py
正在下载 a.jpg
正在下载 b.jpg
正在下载 c.jpg
a.jpg保存成功!
b.jpg保存成功!
c.jpg保存成功!
全部保存完毕!