目录
问题:虽然可以用文件共享数据显示进程间数据通信但问题是
针对上述问题,我们需要找到一种更加合理快捷的方式,那就是队列和管道
这两种方式都是可以实现进程间数据传输的,由于队列是管道+锁的方式实现,所以我们着重研究队列即可
创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。
大白话就是队列支持多个人从队列的一段放入数据,同样支持多个人从队列的另一端取数据
用法
Queue([maxsize]) # 创建共享的进程队列,队列底层使用管道和锁定实现
# 参数:maxsize是队列中允许的最大项数。如果省略次参数,则无大小限制
代码实现
from multiprocessing import Queue
q = Queue(3) # 创建一个最大只能容纳3个数据的队列
"""
常用方法:put、get、put_nowait、get_nowait、full、empty
"""
q.put('sean')
q.put('tank')
q.put('jason')
q.put('111') # 只要队列满了,会进入阻塞
try:
q.put_nowait(3) # 可以使用put_nowait,如果队列满了不会阻塞,但是会因为队列满而报错
except: # 因此我们可以用一个try语句来处理错误,这样程序就不会一直阻塞下去,但是会丢掉这个消息
print('队列满了')
# 因此我们在放入数据前,可以先看下队列的状态,如果满了,就不再put
print(q.full()) # 判断队列中数是否已经存满了
print(q.get())
print(q.get())
print(q.get())
print(q.get()) # 同put方法一样,如果队列已经空了,那么继续取就会出现阻塞
try:
q.get_nowait() # 使用get_nowait,如果队列满了不会阻塞,但是会因为没取到值而报错
except:
print('队列空了')
print(q.empty()) # 判断队列中数据是否已经被全部取出
基于队列实现通信
from multiprocessing import Process, Queue
def f(q):
q.put('hello')
if __name__ == '__main__':
q = Queue()
p = Process(target=f, args=(q,))
p.start()
print(q.get())
p.join()
def producer(q):
q.put('hello big baby')
def consumer(q):
print(q.get())
if __name__ == '__main__':
q = Queue()
p = Process(target=producer, args=(q,))
p.start()
p1 = Process(target=consumer, args=(q,))
p1.start()
在并发编程中使用生产者和消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程额工作能力来提高程序的整体处理数据的速度
什么是生产者消费者模式
为什么要使用生产者和消费者模式
通过队列来实现,解决供需不平衡问题
from multiprocessing import Process, Queue
import time, random, os
def consumer(q):
while True:
res = q.get()
time.sleep(random.randint(1,3))
print('%s 吃 %s' %(os.getpid(),res))
def producer(q):
for i in range(10):
time.sleep(random.randint(1,3))
res = '包子%s' %i
q.put(res)
print('%s 生产了 %s'%(os.getpid(),res))
if __name__ == '__main__':
q = Queue()
p1 = Process(target=producer, args=(q,))
c1 = Process(target=consumer, args=(q,))
p1.start()
c1.start()
print('主')
原文:https://www.cnblogs.com/YGZICO/p/12006732.html