管道

1. client

# 客户端代码
import subprocess
import json

# 启动服务器进程(创建两个管道)
process = subprocess.Popen(
    ['python', 'server.py'],
    stdin=subprocess.PIPE,
    stdout=subprocess.PIPE,
    text=True
)

# 发送请求(写入stdin管道)
request = {"jsonrpc": "2.0", "method": "tools/list", "id": 1}
process.stdin.write(json.dumps(request) + '\n')
process.stdin.flush()

# 接收响应(读取stdout管道)
response_line = process.stdout.readline()
response = json.loads(response_line)
print(response)

2. server

# 服务器代码
import sys
import json

def handle_request(request):
    # 简单返回一个工具列表作为示例
    if request.get("method") == "tools/list":
        return ["tool1", "tool2"]
    return None

# 接收请求(读取stdin管道)
request_line = sys.stdin.readline()
request = json.loads(request_line)

# 处理请求
result = handle_request(request)

# 发送响应(写入stdout管道)
response = {
    "jsonrpc": "2.0",
    "result": result,
    "id": request.get("id")
}
sys.stdout.write(json.dumps(response) + '\n')
sys.stdout.flush()

3. ouput

{'jsonrpc': '2.0', 'result': ['tool1', 'tool2'], 'id': 1}

数据直接在内存中的管道缓冲区传输

服务器进程                    客户端进程
    ↓                           ↑
print("data")              readline()
    ↓                           ↑
stdout buffer    →    pipe buffer    →    stdin buffer
 (进程内存)        (内核空间)        (进程内存)