百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

写C#的前同事竟突然找我咨询python问题,他不写C#了?

wptr33 2025-06-09 00:39 4 浏览

引言

之前已经离职写 C# 的同事今天突然来找我,问我python的问题:

聊天记录截图

一开始以为他改行写python了,原来是他们不再用 matlab ,想通过python的 scipy 库来实现一些算法。

其实都知道python的胶水特性,但真正调用的时候确实会有这样那样的问题。

那怎么办呢?

其实除了直接使用代码调用,更合适的方式其实就是把 python 程序变成一个 中间件,将任务丢给 python 程序,等 结果 计算完成后,再扔回去。

1、RPC是什么

我们将使用 RPC 来实现 中间件,它的全称是 “Remote Procedure Call Protocol”,意思是 远程过程调用

具体是什么呢?它就像是 云函数,它能够让一个程序像调用本地函数一般,通过网络去调用另一个程序的函数。

虽说是通过网络的,那如果部署在同一台电脑上,那就相当于 一个进程调用另一个进程 般丝滑。

2、RPC使用

我们将使用谷歌的 grpc,它支持主流编程语言,且是跨平台的。

2.1 安装库

pip install grpcio grpcio-tools

2.2 定义服务

创建一个 Test.proto 文件,需要在这个文件中定义我们的公开服务。

Test.proto

syntax = "proto3";

message AddRequest {
    repeated float x = 1;
    int32 y = 2;
}

message AddResponse {
    int32 result = 1;
}

service Calculator {
    rpc Add (AddRequest) returns (AddResponse) {}
}

我们设定了一个 Add 的服务,里面参数是 x和y,其中 x对应的是一个浮点数的列表y是一个整型,返回值也是一个 整型

这里为了测试多个数据类型,使用了两种参数,只是为了演示设置的。

2.3 生成服务代码

python -m grpc_tools.protoc -I. --python_out=. --grpc_python_out=. Test.proto       

运行后,将生成两个文件:Test_pb2.py和Test_pb2_grpc.py

.py文件

2.4 创建服务代码

现在我们创建一个 TestService.py 来实现服务。

TestService.py

# -*- coding: utf-8 -*-
from concurrent import futures
import grpc
import Test_pb2_grpc
import Test_pb2
import time


class TestService(Test_pb2_grpc.CalculatorServicer):
    def Add(self, x, y):
        print(x)
        print(y)

        return Test_pb2.AddResponse(result=100)


def run():
    # 设置接收最大为1g
    server_option = [('grpc.max_receive_message_length', 1 * 1024 * 1024 * 1024)]
    server = grpc.server(futures.ThreadPoolExecutor(max_workers=10), options=server_option)
    Test_pb2_grpc.add_CalculatorServicer_to_server(TestService(), server)
    port = 8245
    server.add_insecure_port(f'[::]:{port}')
    server.start()

    print('服务启动')
    try:
        while True:
            print('进入循环')
            time.sleep(60)
    except KeyboardInterrupt:
        server.stop(0)


if __name__ == '__main__':
    run()

我们启动了一个端口为 8245 的服务,只打印了 x和y的值,返回了 100

2.5 测试服务

我们编写一个 TestClient.py 来测试服务。

TestClient.py

import grpc
import Test_pb2_grpc
import Test_pb2

def test_run():
    conn = grpc.insecure_channel('localhost:8245')
    client = Test_pb2_grpc.CalculatorStub(channel=conn)

    request = Test_pb2.AddRequest(
        x=[1.1, 1.2, 1.3],
        y=5,
    )
    response = client.Add(request)
    print(response)


if __name__ == '__main__':
    test_run()

我们使用 python 来测试服务,当然如果你有其他语言的程序,可以使用相应语言程序的 grpc 测试服务。

2.6 查看输出

TestService.py 的输出

x: 1.1
x: 1.2
x: 1.3
y: 5

TestService.py 的输出

x: 1.1
x: 1.2
x: 1.3
y: 5

TestClient.pyd 的输出

result: 100

可以看到,服务获取到了客户端的参数,而客户端得到了服务端的结果。

结尾

现在你已经知道了如何通过 RPC 来实现不同语言与 python 的交互,它能够像使用本地函数一样,调用 python 的实现,可以说非常适合跨语言开发。

相关推荐

Linux文件系统操作常用命令(linux文件内容操作命令)

在Linux系统中,有一些常用的文件系统操作命令,以下是这些命令的介绍和作用:#切换目录,其中./代表当前目录,../代表上一级目录cd#查看当前目录里的文件和文件夹ls#...

别小看tail 命令,它难倒了技术总监

我把自己以往的文章汇总成为了Github,欢迎各位大佬star...

lnav:基于 Linux 的高级控制台日志文件查看器

lnav是一款开源的控制台日志文件查看器,专为Linux和Unix-like系统设计。它通过自动检测日志文件的格式,提取时间戳、日志级别等关键信息,并将多个日志文件的内容按时间顺序合并显示,...

声明式与命令式代码(声明模式和命令模式)

编程范式中的术语和差异信不信由你,你可能已经以开发人员的身份使用了多种编程范例。因为没有什么比用编程理论招待朋友更有趣的了,所以这篇文章可以帮助您认识代码中的流行范例。命令式编程命令式编程是我们从As...

linux中的常用命令(linux常用命令和作用)

linux中的常用命令linux中的命令统称shell命令shell是一个命令行解释器,将用户命令解析为操作系统所能理解的指令,实现用户与操作系统的交互shell终端:我们平时输入命令,执行程序的那个...

提高工作效率的--Linux常用命令,能够决解95%以上的问题

点击上方关注,第一时间接受干货转发,点赞,收藏,不如一次关注评论区第一条注意查看回复:Linux命令获取linux常用命令大全pdf+Linux命令行大全pdf...

如何限制他人操作自己的电脑?(如何控制别人的电脑不让发现)

这段时间,小猪罗志祥正处于风口浪尖,具体是为啥?还不知道的小伙伴赶紧去补一下最近的娱乐圈八卦~简单来说,就是我们的小罗同事,以自己超强的体力,以及超强的时间管理能力,重新定义了「多人运动」的含义,重新...

最通俗易懂的命令模式讲解(命令模式百科)

我们先不讲什么是命令模式,先通过一个场景来引出命令模式,看看命令模式能解决什么样的问题。现在有一个渣男张三,他有还几个女朋友,你现在是不是还是单身狗,你就说你气不气?然后他需要每天分别叫几个女朋友起床...

互联网大厂后端必看!Spring Boot 中Runtime执行与停止命令?

你是否曾在使用SpringBoot开发项目时,遇到需要执行系统命令的场景?比如调用脚本进行文件处理,又或是启动外部程序?很多后端开发人员会使用Processexec=Runtime.get...

Linux 常用命令(linux常用的20个命令面试)

日志排查类操作命令...

Java字节码指令:if_icmpgt(0xA3)(java字节码使用的汇编语言)

if_icmpgt是Java字节码中的一条条件跳转指令,其全称是"IfIntegerCompareGreaterThan"。它用于比较两个整数值的大小。如果栈顶的第一个...

外贸干货|如何增加领英的曝光量和询盘

#跨境电商#...

golang执行linux命令(golang调用shell脚本)

需求需要通过openssl生成rsa秘钥,然后保存该秘钥。代码实例packagemainimport("io/ioutil""bytes"&...

LINUX磁盘挂载(linux磁盘挂载到windows)

1、使用root用户查看磁盘挂载情况:fdisk-l2、使用df查看当前磁盘挂载情况,根据和fdisk-l的结果进行对比,查看还有那些磁盘未使用3、挂载:mount磁盘挂载路径...

Linux命令学习——nl命令(linux ln命令的使用)

nl命令主要功能为每一个文件添加行号,每一个输入的文件添加行号后发送到标准输出。当没有文件或文件为-时,读取标准输入...