进程间通信的编程方式(IPC)及实验

        进程间通信(IPC)方式

目录

Socket

管道

匿名管道

消息队列

共享内存

信号

远程过程调用


Socket

        Socket编程是一种在计算机网络中进程间通信的编程方法。Socket提供了一种在不同主机上运行的进程之间传输数据的机制。通过使用Socket API,开发者可编写用于发送和接收数据的客户端和服务器应用程序。

        Scope:Socket通常用于实现C-S架构的网络应用程序,如Web服务器、聊天应用程序等

        以下是一Python Socket编程示例,包括一个TCP回显服务器和一个TCP客户端。

        客户端:

import socketdef main():client_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)client_socket.connect(('localhost', 12345))while True:message = input("Enter message to send (or 'exit' to quit): ")if message == 'exit':breakclient_socket.sendall(message.encode())response = client_socket.recv(1024)print(f"Received: {response.decode()}")client_socket.close()if __name__ == "__main__":main()# 客户端连接到本地主机的端口12345上的服务器。
# 客户端从用户输入获取消息,将其发送到服务器,并接收服务器的回显响应。
# 当用户输入“exit”时,客户端断开连接并退出。

         服务器:

import socketdef main():server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)server_socket.bind(('localhost', 12345))server_socket.listen(5)print("Server is listening on port 12345...")while True:client_socket, client_address = server_socket.accept()print(f"Connection from {client_address}")data = client_socket.recv(1024)while data:print(f"Received: {data.decode()}")client_socket.sendall(data)data = client_socket.recv(1024)print("Closing connection")client_socket.close()if __name__ == "__main__":main()# 服务器在本地主机的端口12345上监听连接。
# 当客户端连接到服务器时,服务器会接收客户端发送的数据,并将其回显(发送)回客户端。
# 当客户端断开连接时,服务器关闭与客户端的连接并继续监听新的连接。

管道

        管道(Pipe):管道是一种基于字节流的通信方式,通常用于具有父子关系的进程之间的通信。

        scope:管道通常用于实现命令行程序的输入输出重定向和管道操作

        以下示例用python实现,用os.pipe()在父子进程之间进行通信。

import osdef main():r, w = os.pipe()if os.fork():# 父进程os.close(w)r = os.fdopen(r)print("Parent: Received message:", r.read())r.close()else:# 子进程os.close(r)w = os.fdopen(w, 'w')w.write("Hello from child process!")w.close()if __name__ == "__main__":main()

        更常用的,Linux中的命令比如 

# cat命令读取名为input.txt文件内容,并传递给grep命令过滤包含信息的行,过滤结果保存到名为output.txt的文件中。
cat input.txt | grep 'pattern' > output.txt

示例中涉及到三个进程:

  1. cat命令:这个进程负责读取input.txt文件的内容。cat命令将文件内容输出到标准输出(stdout)。

  2. grep命令:这个进程负责从标准输入(stdin)读取数据(即cat命令的输出),并过滤出包含特定模式的行。grep命令将过滤后的结果输出到标准输出。

  3. 输出重定向(>):这个操作将grep命令的输出重定向到output.txt文件中,而不是显示在屏幕上。

匿名管道

        匿名管道(Anonymous Pipe):匿名管道是一种基于文件描述符的通信方式,通常用于具有父子关系的进程之间的通信。

        Scope:匿名管道通常用于实现多进程并行计算和数据处理任务。

        Python示例,展示了如何使用multiprocessing.Pipe()在父子进程之间进行通信:

from multiprocessing import Process, Pipedef child(conn):conn.send("Hello from child process!")conn.close()def main():parent_conn, child_conn = Pipe()p = Process(target=child, args=(child_conn,))p.start()print("Parent: Received message:", parent_conn.recv())p.join()if __name__ == "__main__":main()

消息队列

        消息队列(Message Queue):消息队列是一种基于消息的通信方式,可以用于任意关系的进程之间的通信。比如提供了更高级功能和特性的:RabbitMQ 和 Celery等等。 

        Scope:消息队列通常用于实现分布式系统和微服务架构中的异步通信和任务分发

        以下示例展示了如何使用multiprocessing.Queue()在两个进程之间进行通信:

from multiprocessing import Process, Queuedef producer(queue):queue.put("Hello from producer process!")def consumer(queue):print("Consumer: Received message:", queue.get())def main():queue = Queue()p1 = Process(target=producer, args=(queue,))p2 = Process(target=consumer, args=(queue,))p1.start()p2.start()p1.join()p2.join()if __name__ == "__main__":main()

共享内存

        共享内存(Shared Memory):共享内存是一种基于内存的通信方式,可以用于任意关系的进程之间的通信。共享内存允许多个进程访问同一块内存区域,从而实现进程间的数据共享。
        Scope:共享内存通常用于实现高性能计算和实时系统中的数据交换和同步

        以下示例展示了如何使用multiprocessing.Value()在两个进程之间共享内存

from multiprocessing import Process, Valuedef increment(shared_value):shared_value.value += 1def main():shared_value = Value('i', 0)print("Initial value:", shared_value.value)p = Process(target=increment, args=(shared_value,))p.start()p.join()print("Final value:", shared_value.value)if __name__ == "__main__":main()

信号

        信号(Signal):信号是一种基于事件的通信方式,用于通知进程有关特定事件(如实现进程管理(如启动、停止、重启等)、错误处理(如段错误、浮点异常等)和状态通知(如子进程终止、终端关闭等)等功能。
        Scope:信号通常用于实现进程管理、错误处理和状态通知等功能。
        以下Python示例展示了如何使用signal模块处理信号

import os
import signal
import timedef signal_handler(signum, frame):print(f"Received signal {signum} at {time.time()}")def main():# 注册信号处理函数  signal.signal(signal.SIGUSR1, signal_handler)# 获取当前进程IDpid = os.getpid()print(f"Process ID: {pid}")# 循环等待信号while True:print("Waiting for signal...")time.sleep(10)if __name__ == "__main__":main()

远程过程调用

        远程过程调用(Remote Procedure Call,RPC):RPC是一种允许在远程计算机上执行函数或方法的通信方式。RPC隐藏了底层通信细节,使得调用远程函数就像调用本地函数一样简单。以下Python示例展示了如何使用xmlrpc库实现一个简单的RPC服务器和客户端:
        服务器:

from xmlrpc.server import SimpleXMLRPCServerdef add(x, y):return x + ydef main():server = SimpleXMLRPCServer(('localhost', 12345))  # 监听本地主机的端口12345server.register_function(add, 'add')  # 服务器注册了一个名为add的函数,用于将两个数相加print("RPC server is listening on port 12345...")server.serve_forever()if __name__ == "__main__":main()

        客户端:

import xmlrpc.clientdef main():proxy = xmlrpc.client.ServerProxy('http://localhost:12345')  # 连接到RPC服务器result = proxy.add(1, 2)  # 客户端使用ServerProxy对象调用远程的add函数,并接收返回结果print("Result:", result)if __name__ == "__main__":main()

        Scope:RPC通常用于实现分布式系统和微服务架构中的远程服务调用和数据交换

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/31247.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Effective Java笔记(30)优先考虑泛型方法

正如类可以从泛型中受益一般 ,方法也一样。静态工具方法尤其适合于泛型化 。 Collections 中的所有“算法”方法(例如 binarySearch 和 sort )都泛型化了 。 编写泛型方法与编写泛型类型相类似 。 例如下面这个方法,它返回两个集合…

iOS问题记录 - Xcode 15安装低版本iOS模拟器(持续更新)

文章目录 前言开发环境问题描述问题分析1. 定位问题2. 逆向分析2.1. IDA Free2.2. Hopper Disassembler Demo 3. 模拟器日志4. supportedArchs 解决方案最后 前言 最近新需求很多,项目改动很大,开发完成后想测一遍在低版本iOS系统上的兼容性&#xff0c…

分享21年电赛F题-智能送药小车-做题记录以及经验分享

这里写目录标题 前言一、赛题分析1、车型选择2、巡线1、OpenMv循迹2、灰度循迹 3、装载药品4、识别数字5、LED指示6、双车通信7、转向方案1、开环转向2、位置环速度环闭环串级转向3、MPU6050转向 二、调试经验分享1、循迹2、识别数字3、转向4、双车通信5、逻辑处理6、心态问题 …

Docker卸载安装及国内镜像源(详细版)

文章目录 一、卸载已有Docker1、首先判断本地有没有docker:2、判断CentOS下 docker是否在运行:3、停止docker运行&查看状态4、yum查看docker安装的包并卸载5、删除docker安装目录6、查看docker version 二、Docker安装及镜像源配置1、centOS 7 yum源…

Jay17 2023.8.10日报

笔记 【python反序列化】 序列化 类对象->字节流(字符串) 反序列化 字节流->对象 python反序列化没PHP这么灵活,没这么多魔术方法。 import pickle import os class ctfshow(): def init(self): self.username0 self.password0 d…

【数理知识】求刚体旋转矩阵和平移矩阵,已知 N>=3 个点在前后时刻的坐标,且这 N>=3 点间距离始终不变代表一个刚体

序号内容1【数理知识】自由度 degree of freedom 及自由度的计算方法2【数理知识】刚体 rigid body 及刚体的运动3【数理知识】刚体基本运动,平动,转动4【数理知识】向量数乘,内积,外积,matlab代码实现5【数理知识】最…

轻松预约,尽享美食,详解餐厅预约小程序的设计与实现

随着智能手机的普及和人们生活水平的提高,餐厅预约已经成为人们日常生活中的一部分。为了更好地满足人们的需求,许多餐厅开始使用小程序来提供更方便快捷的预约服务。本文将介绍如何制作一款餐厅预约小程序的详细步骤。 1. 进入乔拓云网后台,…

uni-app微信小程序开发自定义select下拉多选内容篇

分享-2023年资深前端进阶:前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的🪜 技术框架公司的选型:uni-app uni-ui vue3 vite4 ts 需求分析:微信小程序-uni-ui内容 1、创建一个自定义的下拉,支持多…

OSPF无法建立领居的原因有哪些(第三十五课)

1 配置OSPF 1.1 思路 1,配置IP地址 2,配置OSPF 配置进程号 route-id进入区域宣告网段 配置IP地址 R1路由表 ------------------------------------------------------------------------------ Routing Tables: Public Destinations : 10 …

《人脸识别技术应用安全管理规定(征求意见稿)》,需要关注三个焦点

目录 严防人脸信息采集与滥用 规范人脸识别信息的处理 保障人脸识别技术的安全 人脸识别主要有三类风险 近日,国家互联网信息办公室发布《人脸识别技术应用安全管理规定(试行)(征求意见稿)》公开征求意见的通知。 …

Python 模块 locust 性能测试

简介 locust 是 Python 的一个开源的负载测试工具,用于测试网络应用程序的性能和可伸缩性。它使用Python编写,并提供了一个简单易用的语法来定义和执行负载测试。locust模块允许用户模拟大量并发用户并观察系统在高负载下的响应情况。 目录 1. 基本用法…

多线程的实现方式Thread、Runnable、Callable

1.并发和并行 并发:在同一时刻,有多个指令在单个CPU上交替执行。 并行:在同一时刻,有多个指令在多个CPU上同时执行 2.多线程的实现方式 2.1 继承Thread类实现方式 2.2 实现Runnable接口的实现方式 2.3 利用Callable接口和Futur…

基于金融行业的软件测试分析

随着银行业务不断增加,业务模式不断复杂化,对我们的银行软件也要求越来越高,产出高质量的产品也非常重要,下面对银行软件测试进行分析总结。 银行软件集中度高,规模庞大,往往是以系统群的方式存在&#xff…

F. Sum and Product - 思维

分析: 题目中的格式有点像韦达定理,就是对于一元二次方程ax^2 bx c 0有 所以可以推出要找的就是两个点,可以直接二分查找存不存在,这题有很多边界问题,有b^2 - 4ac小于0或者等于0,或者求出来的根在数组中…

【STM32】利用CubeMX对FreeRTOS用按键控制任务

对于FreeRTOS中的操作,最常用的就是创建、删除、暂停和恢复任务。 此次实验目标: 1.创建任务一:LED1每间隔1秒闪烁一次,并通过串口打印 2.创建任务二:LED2每间隔0.5秒闪烁一次,并通过串口打印 3.创建任…

Java算法_ 房子强盗(LeetCode_Hot100)

题目描述:你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表…

【字节跳动青训营】后端笔记整理-1 | Go语言入门指南:基础语法和常用特性解析

**本人是第六届字节跳动青训营(后端组)的成员。本文由博主本人整理自该营的日常学习实践,首发于稀土掘金:🔗Go语言入门指南:基础语法和常用特性解析 | 青训营 本文主要梳理自第六届字节跳动青训营&#xff…

【对于一维信号的匹配】对一个一维(时间)信号y使用自定义基B执行匹配追踪(MP)研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

C++——关于命名空间

写c项目时,大家常用到的一句话就是: using namespace std; 怎么具体解析这句话呢? 命名冲突: 在c语言中,我们有变量的命名规范,如果一个变量名或者函数名和某个库里面自带的库函数或者某个关键字重名&…