进程之间的通信(multiprocess.Queue)
一、进程间通信
进程之间的数据是相互隔离的,例如
from multiprocessing import Process
def task():
    global n  # 声明全局变量
    n = 999
    print('子', n)
if __name__ == '__main__':
    p = Process(target=task )
    n=10
    p.start()
    print('主',n)
'''输出结果
主 10
子 999''' # 子进程中的数据并不会影响到父进程的数据
而想做到进程与进程之间的通信,就需要借助到第三方的媒介进行数据的交换获取等操作。
IPC(Inter-Process Communication)进程间通讯
二、队列
multiprocess.Queue
创建共享的进程队列,Queue是多进程安全队列,可以使用Queue实现多进程之间的数据传递。
Queue([maxsize]) #创建共享的进程队列
# maxsize是队列中允许的最大项数。如果省略此参数,则无大小限制
底层队列使用管道和锁定实现。
Queue方法
Queue([maxsize]):创建共享的进程队列。
Queue实例化之后q具有以下方法:
q.get([ block [ ,timeout ] ])
'''返回q中的一个项目。如果q为空,此方法将阻塞,直到队列中有项目可用为止。
block用于控制阻塞行为,默认为True. 如果设置为False,
将引发Queue.Empty异常(定义在Queue模块中)。
timeout是可选超时时间,用在阻塞模式中。
如果在制定的时间间隔内没有项目变为可用,将引发Queue.Empty异常。'''
from  multiprocessing import  Queue
if __name__ == '__main__':
    q = Queue(3)
    q.put('001')
    q.put('002')
    q.put('003')
    print(q.get())
    print(q.get())
    print(q.get())
    print(q.get(block=False))
# 将block设置为False就不会处在阻塞状态,一旦取不到值就会报异常。或者将timeout设定超时时间,超过这个时间取不到值也会报异常,不等待。
q.get_nowait()  # 取值不会处在阻塞状态,一旦取不到值就会报异常
q.put_nowait()  # 将值放入队列。如果队列已满,就会报异常
q.put(item [, block [,timeout ] ] )
'''将item放入队列。如果队列已满,此方法将阻塞至有空间可用为止。
block控制阻塞行为,默认为True。如果设置为False,将引发Queue.Empty异常(定义在Queue库模块中)。
timeout指定在阻塞模式中等待可用空间的时间长短。超时后将引发Queue.Full异常。'''
q.qsize()
'''返回队列中目前项目的正确数量。此函数的结果并不可靠,
因为在返回结果和在稍后程序中使用结果之间,队列中可能添加或删除了项目。
在某些系统上,此方法可能引发NotImplementedError异常。'''
q.empty()
'''判断q队列是否为空,空返回True,否则返回False。
如果其他进程或线程正在往队列中添加项目,结果是不可靠的。也就是说,
在返回和使用结果之间,队列中可能已经加入新的项目。'''
q.full() '''如果q已满,返回为True. 由于线程的存在,结果也可能是不可靠的(参考q.empty()方法)。'''
Queue解决进程间数据隔离问题
from multiprocessing import Queue, Process
import time
def task(q):
    q.put(time.strftime('%Y-%m-%d %H:%M:%S'))
    print('数据放完了')
if __name__ == '__main__':
    q = Queue(3)
    p = Process(target=task, args=(q,))
    p.start()
    res = q.get()
    print('取到了%s' % res)
    print('主')
'''输出结果
数据放完了
取到了2021-07-21 15:46:57
主'''
批量生产数据放入队列再批量获取结果
from multiprocessing import Queue, Process
import time
def q_put(q):
    q.put(time.strftime('%Y-%m-%d %H:%M:%S'))
    print('数据放完了')
def q_get(q):
    print(q.get())
if __name__ == '__main__':
    q = Queue(3)
    p1 = Process(target=q_put, args=(q,))
    p2 = Process(target=q_put, args=(q,))
    p3 = Process(target=q_get, args=(q,))
    p4 = Process(target=q_get, args=(q,))
    p1.start()
    p2.start()
    p3.start()
    p4.start()
生产者消费者模型
import os
import random
import time
from multiprocessing import Process, Queue,set_start_method  # 针对mac用Queue出bug状况
def producer(queue, product):
    for i in range(1, 11):
        print('%s号流水线生产了第%s个%s' % (i, i, product))
        time.sleep(random.random())
        queue.put('第%s个%s' % (i, product))
def consumer(queue):
    while True:
        res = queue.get()
        if not res: break  # 发现none直接结束运行
        print('%s消费者取走了%s' % (os.getpid(), res))
if __name__ == '__main__':
    set_start_method('fork') # 针对mac用Queue出bug状况
    q = Queue(3)
    producer_p = Process(target=producer, args=(q, '大可乐'))
    consumer_p = Process(target=consumer, args=(q,))
    producer_p.start()
    consumer_p.start()
    producer_p.join()  # 让子进程先运行完再添加标志
    q.put(None)
多生产者 多消费者
# 生产者:
def producer(queue, food):
    # 把数据全部放在Queue
    for i in range(10):
        data = "这个进程id:%s, 生产了%s个%s" % (os.getpid(), i, food)
        print(data)
        time.sleep(random.randint(1, 3))
        # 放入数据
        queue.put("第%s个%s" % (i, food))
def consumer(queue):
    while True:
        res = queue.get()
        if not res:break
        data = "这个进程id:%s, 吃了%s" % (os.getpid(), res)
        print(data)
if __name__ == '__main__':
    q = Queue(3)
    p1 = Process(target=producer, args=(q, '面包'))
    p2 = Process(target=producer, args=(q, '奶粉'))
    p3 = Process(target=producer, args=(q, '冰淇淋'))
    p1.start()
    p2.start()
    p3.start()
    p4 = Process(target=consumer, args=(q,))
    p5 = Process(target=consumer, args=(q,))
    p4.start()
    p5.start()
    # time.sleep(1000)
    # none放在这里是不行的,原因是主进程直接执行了put none, 消费者直接获取到None, 程序直接结束了
    # p.join()
    # q.put(None)
    p1.join()
    p2.join()
    p3.join()
    q.put(None)
    q.put(None)
    q.put(None)
多生产者 多消费者  消费者大于生产者
# 生产者:
def producer(queue, food):
    # 把数据全部放在Queue
    for i in range(10):
        data = "这个进程id:%s, 生产了%s个%s" % (os.getpid(), i, food)
        print(data)
        time.sleep(random.randint(1, 3))
        # 放入数据
        queue.put("第%s个%s" % (i, food))
def consumer(queue, name):
    while True:
        try:
            res = queue.get(timeout=5)
            if not res:break
            data = "这个消费者:%s, 吃了%s" % (name, res)
            print(data)
        except Exception as e:
            print(e)
            break
if __name__ == '__main__':
    q = Queue(3)
    p1 = Process(target=producer, args=(q, '面包'))
    p2 = Process(target=producer, args=(q, '奶粉'))
    p3 = Process(target=producer, args=(q, '冰淇淋'))
    p1.start()
    p2.start()
    p3.start()
    p4 = Process(target=consumer, args=(q, '许鹏'))
    p5 = Process(target=consumer, args=(q, '勇哥'))
    p6 = Process(target=consumer, args=(q, '勇哥2'))
    p7 = Process(target=consumer, args=(q, '勇哥3'))
    p4.start()
    p5.start()
    p6.start()
    p7.start()
    # time.sleep(1000)
    # none放在这里是不行的,原因是主进程直接执行了put none, 消费者直接获取到None, 程序直接结束了
    # p.join()
    # q.put(None)
    p1.join()
    p2.join()
    p3.join()
    q.put(None)
    q.put(None)
    q.put(None)
												
											进程之间的通信(multiprocess.Queue)的更多相关文章
- c# IPC实现本机进程之间的通信
		
IPC可以实现本地进程之间通信.这种用法不是太常见,常见的替代方案是使用wcf,remoting,web service,socket(tcp/pipe/...)等其他分布式部署方案来替代进程之间的通 ...
 - python全栈开发   *   进程之间的通信,进程之间数据共享   *    180726
		
进程之间的通信(IPC)队列和管道一.队列 基于管道实现 管道 + 锁 数据安全(一).队列 队列遵循先进先出原则(FIFO) 多用于维护秩序,买票,秒杀 队列的所有方法: put()(给队列里添加数 ...
 - day34——僵尸进程和孤儿进程、互斥锁、进程之间的通信
		
day34 僵尸进程和孤儿进程 基于unix环境(linux,macOS) 主进程需要等待子进程结束之后,主进程才结束 主进程时刻监测子进程的运行状态,当子进程结束之后,一段时间之内,将子进程进行回收 ...
 - Python并发编程03 /僵孤进程,孤儿进程、进程互斥锁,进程队列、进程之间的通信
		
Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 目录 Python并发编程03 /僵孤进程,孤儿进程.进程互斥锁,进程队列.进程之间的通信 1. 僵尸进程/孤儿进 ...
 - python进程之间的通信——Queue
		
我们知道进程之间的数据是互不影响的,但有时我们需要在进程之间通信,那怎么办呢? 认识Queue 可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息 ...
 - 《Python》进程之间的通信(IPC)、进程之间的数据共享、进程池
		
一.进程间通信---队列和管道(multiprocess.Queue.multiprocess.Pipe) 进程间通信:IPC(inter-Process Communication) 1.队列 概念 ...
 - python网络编程中互斥锁与进程之间的通信
		
一.互斥锁 进程之间数据隔离,但是共享一套文件系统,因而可以通过文件来实现进程直接的通信,但问题是必须自己加锁处理. 注意:加锁的目的是为了保证多个进程修改同一块数据时,同一时间只能有一个修改,即串行 ...
 - ython实现进程间的通信有Queue,Pipe,Value+Array等,其中Queue实现多个进程间的通信,而Pipe实现两个进程间通信,而Value+Array使用得是共享内存映射文件的方式,所以速度比较快
		
1.Queue的使用 from multiprocessing import Queue,Process import os,time,random #添加数据函数 def proc_write(qu ...
 - UNIX标准C - 进程之间的通信
		
一.基本概念 进程间通信IPC:进程之间交换数据的过程叫进程间通信 进程间同性的方式: 简单的进程间的通信: 命令行:父进程通过exec函数创建子进程是可以附加一些数据 环境变量表:父进程通过exec ...
 
随机推荐
- php弱类型比较
			
前言:今天XCTF题目中出现了弱类型比较,特别过来记录一下, 0x01: == 是弱类型比较,两个不同类型比较时,会自动转换成相同类型后再比较值 ===是强比较,需要比较值和类型 0x02: 看下图案 ...
 - bugku SKCTF管理系统
			
这题hint是sql约束攻击...sql约束攻击其实我没了解过,当时就各种百度,现在总结一下 0x01: sql约束攻击:通常是sql查询语句select * from username= 'lin' ...
 - WIN10小技巧
			
WIN10激活: powershell管理员运行slmgr /skms kms.03k.orgslmgr /ato CMD:%TEMP% 全选垃圾,删除 手机投屏到WIN10:win+i---系统-- ...
 - Spring框架中一个有用的小组件:Spring Retry
			
1.概述 Spring Retry 是Spring框架中的一个组件, 它提供了自动重新调用失败操作的能力.这在错误可能是暂时发生的(如瞬时网络故障)的情况下很有帮助. 在本文中,我们将看到使用Spri ...
 - canvas实现任意正多边形的移动(点、线、面)
			
前言 我在上一篇文章简单实现了在canvas中移动矩形(点线面),不清楚的小伙伴请看我这篇文章:用canvas 实现矩形的移动(点.线.面)(1). ok,废话不多说,直接进入文章主题, 上一篇文章我 ...
 - Oracle导入dmp文件:ORACLE错误12899而拒绝行的问题如何解决
			
原文链接:https://www.2cto.com/database/201804/736027.html
 - sqldbx配置连接Oracle 12C数据库
			
本地开发环境: Windows10 64位.Oracle 12C客户端 32位.sqlDBX (32位) =============================================== ...
 - C实现奇偶校验
			
奇偶校验原理(来自百度百科):奇偶校验(Parity Check)是一种校验代码传输正确性的方法.根据被传输的一组二进制代码的数位中"1"的个数是奇数或偶数来进行校验.采用奇数的称 ...
 - C语言复习(二)
			
引言: 不会将每一个部分都详述,只关注于一些自己认为重要的或常错的,若有不足,还望指出 switch()细节:括号内必须是整型或枚举类型:遇到break才会跳出:case包含的必须是常量 contin ...
 - 一文读懂Spring动态配置多数据源---源码详细分析
			
Spring动态多数据源源码分析及解读 一.为什么要研究Spring动态多数据源  期初,最开始的原因是:想将答题服务中发送主观题答题数据给批改中间件这块抽象出来, 但这块主要使用的是mq消息的方式 ...