zoukankan      html  css  js  c++  java
  • Python进程间通信

    Python进程间通信

    进程间通信(IPC)

    1.必要性: 进程间空间独立,资源不共享,此时在需要进程间数据传输时就需要特定的手段进行数据通信。

    2.常用进程间通信方法:管道通信、消息队列、共享内存、信号量

    管道通信(Pipe)

    1.通信原理:在内存中开辟管道空间,生成管道操作对象,多个进程使用同一个管道对象进行读写即可实现通信

    2.实现方法

    from multiprocessing import Pipe

    fd1,fd2 = Pipe(duplex = True)

    • 功能: 创建管道
    • 参数:默认表示双向管道
    • 如果为False 表示单向管道
    • 返回值:表示管道两端的读写对象
    •   如果是双向管道均可读写
    •   如果是单向管道fd1只读 fd2只写

    fd.recv()

    • 功能 : 从管道获取内容
    • 返回值:获取到的数据

    fd.send(data)

    • 功能: 向管道写入内容
    • 参数: 要写入的数据

    img 管道通信示例

    消息队列

    1.通信原理:在内存中建立队列模型,进程通过队列将消息存入,或者从队列取出完成进程间通信。

    2.实现方法

    from multiprocessing import Queue

    q = Queue(maxsize=0)

    • 功能: 创建队列对象
    • 参数:最多存放消息个数
    • 返回值:队列对象

    q.put(data,[block,timeout])

    • 功能:向队列存入消息
    • 参数:data 要存入的内容
    • block 设置是否阻塞 False为非阻塞
    • timeout 超时检测

    q.get([block,timeout])

    • 功能:从队列取出消息
    • 参数:block 设置是否阻塞 False为非阻塞
    • timeout 超时检测
    • 返回值: 返回获取到的内容

    q.full() 判断队列是否为满

    q.empty() 判断队列是否为空

    q.qsize() 获取队列中消息个数

    q.close() 关闭队列

    img 消息队列演示

    共享内存

    1.通信原理:在内中开辟一块空间,进程可以写入内容和读取内容完成通信,但是每次写入内容会覆盖之前内容。

    2.实现方法

    img

    from multiprocessing import Value,Array

    obj = Value(ctype,data)

    • 功能 : 开辟共享内存
    • 参数 : ctype 表示共享内存空间类型 'i' 'f' 'c'
    •     data 共享内存空间初始数据
    • 返回值:共享内存对象

    obj.value

    • 对该属性的修改查看即对共享内存读写

    obj = Array(ctype,data)

    • 功能: 开辟共享内存空间
    • 参数: ctype 表示共享内存数据类型
    •     data 整数则表示开辟空间的大小,其他数据类型表示开辟空间存放的初始化数据
    • 返回值:共享内存对象

    Array共享内存读写: 通过遍历obj可以得到每个值,直接可以通过索引序号修改任意值。

    * 可以使用obj.value直接打印共享内存中的字节串
    

    img value

    img array

    多进程和多线程总结

    1.什么是进程?什么是线程?

    进程是表示资源分配的基本单位,又是调度运行的基本单位。
    例如,用户运行自己的程序,系统就创建一个进程,并为它分配资源,
    包括各种表格、内存空间、磁盘空间、I/O设备等。然后,把该进程放
    人进程的就绪队列。进程调度程序选中它,为它分配CPU以及其它有关资源,该进程才真正运行。

    线程是进程中执行运算的最小单位,如果把进程理解为在逻辑上操作系统所完成的任务,
    那么线程表示完成该任务的许多可能的子任务之一。例如,假设用户启子任务;在产生
    工资单报表的过程中,用户又可以输人数据库查询请求,这又是一个子任务。

    多线程就像是火车上的每节车厢,而进程就是火车。

    2.多进程和多线程的区别?

    • 数据共享、同步:
      1). 数据共享复杂,需要用IPC;数据是分开的,同步简单
      2). 因为共享进程数据,数据共享简单,但也是因为这个原因导致同步复杂
      各有优势
    • 内存、CPU
      1). 占用内存多,切换复杂,CPU利用率低
      2). 占用内存少,切换简单,CPU利用率高
      线程占优
    • 创建销毁、切换
      1). 创建销毁、切换复杂,速度慢
      2). 创建销毁、切换简单,速度很快
      线程占优
    • 编程、调试
      1). 编程简单,调试简单
      2). 编程复杂,调试复杂
      进程占优
    • 可靠性
      1). 进程间不会互相影响
      2). 一个线程挂掉将导致整个进程挂掉
      进程占优
    • 分布式
      1). 适应于多核、多机分布式;如果一台机器不够,扩展到多台机器比较简单
      2). 适应于多核分布式
      进程占优

    3.进程之间的通信方式以及优缺点?

    管道, 信号量, 信号, 消息队列, 共享内存, 套接字

    4.线程之间的通信方式?

    锁机制:包括互斥锁、条件变量、读写锁
    信号量机制(Semaphore)
    信号机制(Signal)

    5.什么时候用多线程?什么时候用多进程?

    1)需要频繁创建销毁的优先用线程
    2)需要进行大量计算的优先使用进程
    3)可能要扩展到多机分布的用进程,多核分布的用线程


    参考链接

  • 相关阅读:
    《当大数据遇见网络:大数据与SDN》
    Internet History, Technology and Security (Week 9)
    Internet History, Technology and Security (Week 8)
    Internet History, Technology and Security (Week 7)
    北京讲座所感---6.14~6.15
    Internet History, Technology and Security (Week 6)
    Internet History, Technology and Security (Week 4)
    Internet History, Technology and Security (Week 3)
    Alpha 事后诸葛亮(团队)
    Alpha答辩总结
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/13419998.html
Copyright © 2011-2022 走看看