Python进程间通信

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保存成功!
全部保存完毕!
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时空无限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值