进程通信工具有哪些?这些工具你可能天天在用

平时写程序、做开发,或者搭建服务的时候,经常要让两个程序“说上话”。比如你本地跑了个Python脚本,想把数据传给另一个Node.js服务,就得靠进程通信。别以为这多高深,其实我们每天都在接触这类工具

管道(Pipe):最基础的“传话筒”

管道是最早也最简单的进程通信方式。就像一根水管,一头进数据,另一头出数据。常见于命令行中,比如执行 ps aux | grep python,这里的竖线就是匿名管道,把前一个命令的结果传给后一个。

系统还支持命名管道(FIFO),可以在不同进程间通过文件路径来通信,适合一些轻量级的本地协作场景。

信号(Signal):发个“通知”就行

信号不算传数据,更像是“打招呼”。比如你按 Ctrl+C 终止程序,其实是给进程发送了 SIGINT 信号。程序收到后可以选择退出或做些清理工作。这种方式简单直接,但不适合传输复杂信息。

共享内存:大家共用一块“白板”

多个进程直接读写同一块内存区域,效率最高。比如数据库服务和缓存进程之间需要快速交换大量数据时,就会用到共享内存。不过得小心处理同步问题,不然容易出现数据错乱,就像好几个人同时在一张纸上写字,没人排队就乱套了。

消息队列:带缓冲的“留言条”

消息队列像是一个中间人,帮你把消息暂存起来,接收方有空再取。Linux下的POSIX消息队列或System V消息队列都属于这一类。适合异步通信,比如后台任务处理系统,前端提交任务后不必等待,消息自动入队, worker进程慢慢消费。

Socket:不限本地,网络也能通

Socket大家更熟悉,不仅能用于网络通信,也可以用于本地进程间通信(Unix域套接字)。比如Nginx和PHP-FPM之间常通过 Unix Socket 通信,比走TCP更快,还不占网络端口。

import socket

# 创建 Unix 域套接字示例
sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
sock.connect('/tmp/myapp.sock')
sock.send(b'Hello from client')
print(sock.recv(1024))
sock.close()

DBus:桌面环境里的“通信中枢”

如果你用的是Linux桌面系统,那DBus很可能已经在后台运行了。它被广泛用于桌面应用之间的通信,比如音乐播放器通知系统托盘更新状态,或者蓝牙设备连接时触发音量调整。DBus提供了服务注册和方法调用机制,结构清晰,适合复杂交互。

gRPC 或 REST API:现代微服务的选择

虽然听起来像网络通信,但在同一台机器上的多个服务之间,也常用gRPC或HTTP API来通信。比如你本地起了一个用户服务和订单服务,虽然都在本机,但通过定义好的接口调用,更清晰、易维护。尤其是容器化部署后,这种模式越来越普遍。

这类方式依赖网络栈,但胜在跨语言、结构明确,调试也方便。配合内网穿透工具,甚至能让外网临时访问到本地服务接口,调试联调特别实用。