混合使用Python和Go

16 投票
3 回答
10901 浏览
提问于 2025-04-18 04:23

我一直在用Python开发一个库,现在想对它进行一些性能上的提升。

我想知道,能不能在Python和Go这两种语言中写一些代码,并且让它们之间传递数据?

如果可以的话,有没有相关的例子可以参考?

比如这样的:

# Python
def python_foo():
    data = {'foo': 'val', 'bar': [1, 2, 3]}
    go_process(json.dumps(data))


def python_got_data_from_go(data):
    # deal with data from Go


# Go
func go_process(json string) {
    // do some processing
    python_got_data_from_go(someData)
}

3 个回答

2

最简单的办法是从Python启动一个Go程序,然后让它们通过Go的标准输入输出进行交流(也就是os.Stdinos.Stdout)。你需要设计一个双方都能理解的协议(看起来你已经选择了JSON作为协议了),而且在发送一个完整的请求后,记得要刷新一下流,这样双方都能及时收到信息。

这样做的话,你的解决方案几乎可以在任何平台上使用,而且设置起来非常简单。

3

混合不同编程语言最简单的方法是通过“套接字”来交流,比如使用TCP/IP或者Unix域套接字,或者通过一些高级协议,比如HTTP或XML-RPC。不过,这种方法的开销比较大,因为在处理请求时需要进行序列化和反序列化,也就是把数据转换成JSON或XML格式,这在你需要频繁调用的时候会变得很耗费资源。如果每次请求处理的工作量很大,使用套接字通常是最好的选择。

如果你不想承担套接字带来的开销(比如每秒需要在Python和Go之间进行成千上万次请求),那么还有其他一些开销较小的解决方案。你可以尝试在支持共享内存的操作系统中使用共享内存。共享内存访问数据的成本通常更低,但从共享内存结构转换到Python数据类型时可能会有额外的开销。此外,你可能还需要自己管理锁的问题。

除非你只进行非常少量的调用,并且这些调用之间不需要共享状态,否则我不建议使用标准的输入输出(stdin/stdout)进行通信。

最后一个选择是编写Python扩展;不过我不推荐给那些心脏不够强大的人。

10

你需要在它们之间搭一个“桥”,比如使用 C 编程语言或者通过网络进行通信。如果你把 Python扩展Go语言的cgo 混合在一起,再加上对 C 的良好编程技能,那可真是个麻烦的解决方案。

你可以在Python中创建一个服务器,参考 这个链接,然后在Go中也创建一个服务器,参考 这个链接,然后让它们之间进行通信。

补充:可以查看 用Go语言编写Python扩展从Go调用Python函数并获取返回值

撰写回答