广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python中进程间通信详细介绍
  • 239
分享到

python中进程间通信详细介绍

2024-04-02 19:04:59 239人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录进程间通信(IPC)管道通信(Pipe)1.通信原理2. 实现方法共享内存1.通信原理2.实现方法信号量(信号灯集)1.通信原理2. 实现方法3.代码演示进程间通信(IPC) 必

进程间通信(IPC)

必要性

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

常用进程间通信方法

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

管道通信(Pipe)

1.通信原理

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

代码演示(windows 无效 linux 可用)


"""
pipe.py 管道通信
注意
1. multiprocessing 中管道通信只能用于有亲缘关系进程中
2. 管道对象在父进程中创建,子进程通过父进程获取
"""
from multiprocessing import Process, Pipe

# 创建 管道
fd1, fd2 = Pipe()
def app1():
    print('1 启动应用1,请登录')
    print('2 请求app2授权')
    fd1.send('app1 请求登录')
    data = fd1.recv()
    print('5 ??',data)
    if data:
        print('6 登录成功:', data)


def app2():
    print('2.5')
    # 阻塞等待读取管道内容
    data = fd2.recv()
    print('3 app2', data)
    fd2.send(('Dave', '123'))
    print('4 app2,发送完毕')


if __name__ == '__main__':
    print(-5)
    p1 = Process(target=app1)
    print(-4)
    p2 = Process(target=app2)
    print(-3)
    p1.start()
    print(-2)
    p2.start()
    print(-1)
    p1.join()
    print(0)
    p2.join()
    print('运行结束')
"""
运行结果
(base) [root@VM-0-12-Centos pipe]# python pipe.py
-5
-4
-3
-2
-1
1 启动应用1,请登录
2 请求app2授权
2.5
3 app2 app1 请求登录
4 app2,发送完毕
5 ?? ('Dave', '123')
6 登录成功: ('Dave', '123')
0
运行结束

"""

消息队列

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

2. 实现方法


"""
quque_test.py 消息队列演示
注意: 消息队列符合先进先出原则
"""

# 创建消息队列
from multiprocessing import Queue, Process
from random import randint

# 以下模拟 双色球
# 创建消息队列
q = Queue(5)

def handle():
    print(5)
    for i in range(6):
        q.put(randint(1, 33))
    q.put(randint(1, 16))

def request():
    print(6)
    l = [q.get() for i in range(6)]
    l.sort()
    l.append(q.get())
    print(7,l)

if __name__ == '__main__':
    print(0)
    p1 = Process(target=handle)
    print(1)
    p2 = Process(target=request)
    print(2)
    p1.start()
    print(3)
    p2.start()
    print(4)
    p1.join()
    p2.join()
    print(8)
    print('程序结束')

控制台输出 linux (windows无效)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cXtoSmyN-1639571874327)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215185302558.png)]

共享内存

1.通信原理

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

2.实现方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-A5RVhKd1-1639571874328)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215185911875.png)]

value ,array


from multiprocessing import Value,Array

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

obj.value 对象属性的修改查看即对共享内存读写

obj = Array(ctype,data)
功能: 开辟共享内存
参数: ctype 表示共享内存空间类型 'i' 'f' 'c'
	data 整数表示开辟空间的大小,其数据表示开辟空间
返回值: 共享内存对象

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

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

value 代码 演示


"""
value.py 开辟单一共享内存空间
注意:共享内存只能有一个值
"""

from multiprocessing import Value,Array,Process


import time
import random
ctype = 'i'
data = 5000
# 创建共享内存
money = Value(ctype,data)

# 操作共享内存
def man():
    for i in range(30):
        time.sleep(0.1)
        money.value += random.randint(1,1000)
        print('man',money.value)

def girl():
    for i in range(30):
        time.sleep(0.1)
        money.value -= random.randint(1,800)
        print('girl', money.value)

if __name__ == '__main__':
    p1 = Process(target=man)
    p2 = Process(target=girl)
    p1.start()
    p2.start()
    p1.join()
    p2.join()
    print('程序结束',money.value)

array 代码演示


"""
array.py 开辟单一共享内存空间
注意:共享内存只能有一个值
"""

from multiprocessing import Array,Process


ctype = 'i'
data = [1,2,3,4]
# 创建共享内存
# shm = Array(ctype,data)

# 表示初始值 [0,0,0,0,0]
shm = Array(ctype,5)


def fun():
    for i in shm:
        print(i)
    shm[1] = 1000
if __name__ == '__main__':
    p1 = Process(target=fun)
    p1.start()
    p1.join()
    print('程序结束',shm[1])

信号量(信号灯集)

1.通信原理

给定一个数量多多个进程可见,多个进程都可以操作该数增减,并根据数量值决定自己的行为

2. 实现方法


from multiprocessing import Semaphore

sem = Semaphore(num)
功能: 创建信号量对象
参数: 信号量的初始值
返回值: 信号量对象

sem.acquire() 信号量减1 当信号量为0时阻塞
sem.release() 信号量加1
sem.get_value() 获取信号量数量

3.代码演示


"""
信号量.py 信号量演示
思路: 信号量数量相当于资源,执行任务必须消耗资源
"""
import os
from multiprocessing import Semaphore
from multiprocessing import Process
from time import sleep

num = 3
sem = Semaphore(num)


# 任务函数
def handle():
    sem.acquire()  # sem -1
    print("%s 开始执行任务" % os.getpid())
    sleep(3)
    print("%s 执行任务完毕" % os.getpid())
    sem.release()  # sem +1


if __name__ == '__main__':
    ths = []
    for i in range(10):
        p = Process(target=handle)
        p.start()
        ths.append(p)

    for p in ths:
        p.join()
    print('程序结束')

控制台运行结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BjnjTpgF-1639571874329)(C:\Users\Administrator\AppData\Roaming\Typora\typora-user-images\image-20211215203718835.png)]

到此这篇关于Python中进程间通信详细介绍的文章就介绍到这了,更多相关python进程间通信内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: python中进程间通信详细介绍

本文链接: https://www.lsjlt.com/news/160041.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python中进程间通信详细介绍
    目录进程间通信(IPC)管道通信(Pipe)1.通信原理2. 实现方法共享内存1.通信原理2.实现方法信号量(信号灯集)1.通信原理2. 实现方法3.代码演示进程间通信(IPC) 必...
    99+
    2022-11-12
  • 详细介绍java UDP通信
    介绍:UDP为用户数据报协议,在java中操纵UDP使用JDK中java.net包下的DatagramSocket和DatagramPacket类,可以方便的控制用户数据报文。DatagramPacket类将数据字节填充到UDP包中,这称为...
    99+
    2016-02-03
    java教程 java UDP通信
  • C++通信新特性协程详细介绍
    目录一、关于协程二、协程的好处三、协程得用法四、与线程的区别五、协程示例一、关于协程 从 1.54.0 版本开始,Boost.Asio 支持协程。虽然您可以直接使用 Boost.Co...
    99+
    2022-11-13
    C++通信新特性协程 C++协程 C++通信特性
  • PythonDjango中间件详细介绍
    目录一 .中间件简介二 .编写自己的中间件三 .中间件执行流程一 .中间件简介 中间件是Django请求/响应处理的钩子函数。它是一个轻量级的、低级的"插件系统"...
    99+
    2022-11-11
  • Python Socket编程详细介绍
    在使用Python做socket编程时,由于需要使用阻塞(默认)的方式来读取数据流,此时对于数据的结束每次都需要自己处理,太麻烦。并且网上也没找到太好的封装,所以就自己写了个简单的封装。 封装思路 1....
    99+
    2022-06-04
    详细介绍 Python Socket
  • Python 通过pip安装Django详细介绍
    Python 通过pip安装Django详细介绍 经过前面的 Python 包管理工具的学习,接下来我们就要基于前面的知识,来配置 Django 的开发与运行环境。 首先是安装 Django(通过pip安装...
    99+
    2022-06-04
    详细介绍 Python pip
  • Android进程间通信(IPC)机制Binder简要介绍
            在Android系统中,每一个应用程序都是由一些Activity和Service组成的,这...
    99+
    2022-06-06
    ipc binder 通信 Android
  • Python的进程间通信详解
    目录进程概述队列简介多进程队列的使用使用队列在进程间通信总结进程概述 ​ 进程(Process)是计算机中已运行程序的实体。进程与程序不同,程序本身只是指令、数据及器组织形式的描述,...
    99+
    2022-11-13
  • Vue父子组件通信全面详细介绍
    目录1.Vue父子组件通信方式2.不同文件间的通信方式1 .父组件vue文件和子组件vue文件2 .父组件jsx文件和子组件vue文件3 .父组件vue文件和子组件jsx文件4 .父...
    99+
    2022-11-13
    vue的父子组件通信 vue父子组件通信例子
  • Python中栈的详细介绍
    目录1、问题描述2、解决方案3、结语本文转自公众号:"算法与编程之美" 1、问题描述 Python中数据类型有列表,元组,字典,队列,栈,树等等。像列表,元组这样的都是python内...
    99+
    2022-11-12
  • Python线程指南详细介绍
    本文介绍了Python对于线程的支持,包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例。 注意:本文基于Python2.4完成,;如果看到不明白的词汇请记得百度谷歌或维...
    99+
    2022-06-04
    详细介绍 线程 指南
  • Python编程语言详细介绍
    目录一、语法1、缩进2、变量3、表达式4、类型5、方法二、 库1、Python的应用3、值得学习Python吗? 前言: Python是世界上最流行的解释型编程语言之一。Python...
    99+
    2022-11-12
  • python流程控制详细介绍
    目录1. 布尔逻辑1.1 条件控制语句-if1.2 if/else 语句1.3 if/elif 语句2 循环控制语句2.1 循环控制之for2.2 循环控制之while3 for v...
    99+
    2022-11-12
  • Android Init进程对信号的处理流程详细介绍
    Android  Init进程对信号的处理流程 在Android中,当一个进程退出(exit())时,会向它的父进程发送一个SIGCHLD信号。父进程收到该信号后,会...
    99+
    2022-06-06
    init Android
  • 基于Android AIDL进程间通信接口使用介绍
    AIDL:Android Interface Definition Language,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。 I...
    99+
    2022-06-06
    通信接口 aidl 通信 接口 Android
  • Python中的列表详细介绍
    本篇内容主要讲解“Python中的列表详细介绍”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python中的列表详细介绍”吧!Python中的for循环Python中的for循环语句按顺序遍历任...
    99+
    2023-06-16
  • C++中的命名空间详细介绍
    目录命名空间的特性声明命名空间和命名空间成员全局命名空间不连续命名空间嵌套命名空间using声明和using编译指令命名空间别名综合代码示例总结命名空间的特性 首先熟悉一下命名空间的...
    99+
    2022-11-13
  • python 进程间通信
    python multiprocessing multiprocessing 在2.6才开始使用 multiprocessing 是一个使用方法类似threading模块的进程模块。允许程序员做并行开发。并且可以在UNIX和Windo...
    99+
    2023-01-31
    进程 通信 python
  • 【MySQL进阶教程】 索引详细介绍
    前言 本文为 【MySQL进阶教程】 索引 相关知识介绍,下边具体将对索引概述,索引结构(包括:索引结构概述,二叉树,B-Tree,B+Tree,Hash),索引分类,索引语法(包括:创建索引,查看...
    99+
    2023-10-03
    mysql java 数据库
  • 【MySQL进阶教程】锁的详细介绍
    前言 本文为 【MySQL进阶教程】锁 相关知识,下边将对锁的概述,全局锁(包含全局锁的介绍,语法与特点),表级锁(包含表级锁的介绍,表锁,元数据锁,意向锁),行级锁(包含行级锁的介绍,行锁,间隙锁...
    99+
    2023-09-01
    mysql 数据库 java
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作