最简单的golang与python跨机器通信的发布-订阅方式?

3 投票
2 回答
3912 浏览
提问于 2025-04-18 13:36

我正在开发一个用Golang写的网页应用,需要调用一个Python程序来处理一些比较复杂的工作。因为这些工作对内存和CPU的要求很高,所以可能需要在另一台机器上运行。由于Golang和Python之间不能直接沟通,有三种方法可以实现这个需求:

  1. 直接从Go中执行Python程序作为操作系统进程(如果在同一台机器上)或者使用RPC?
  2. 把Python进程封装成一个服务,让它可以被Go调用(可以是一个简单的CRUD服务,比如用Bottle或Flask做的RESTful服务)
  3. 建立一个简单的发布-订阅系统来实现这个功能(比如使用Redis或其他消息队列系统) - 另外,计划中有基于Redis的缓存,所以这可能是一个不错的选择。不过我不太确定。

最重要的是,那个需要很长时间才能完成的Python进程必须“通知”网页应用它已经完成。数据可以保存在文件或数据库中,或者由进程“返回”。

在一个类似发布-订阅的环境中,最简单的实现方法是什么呢?

更新 REST看起来是一个可行的方法,但会增加实现服务器推送的成本,这可能在现有的微型网页框架中不太容易做到。发布-订阅会增加额外的复杂性,维护起来也会有一定的学习曲线。我不确定跨机器是否可以实现类似RPC的调用。在这方面,什么选择比较好呢?

2 个回答

0

对于你的具体情况,从Go中直接启动进程并读取标准输出是最有效的,这样做没有必要增加额外的负担。

这很大程度上取决于你的Python脚本在做什么。如果它只是执行一个特定的任务,那么直接启动进程并检查退出代码就足够了。如果你需要让脚本一直在后台运行并与之通信,那么Redis或ZeroMQ是不错的选择,这两个在Go和Python中都很成熟。

如果脚本在不同的服务器上,那么使用ZeroMQ/RPC或者直接用Python搭建一个简单的HTTP服务器都可以,额外的负担应该很小。

4

使用ZeroMQ

Python有一个很不错的库叫做pyzmq

还有Golang的绑定可以使用。

ZeroMQ的代码通常很简短且高效。

你甚至可以在Unix系统上使用本地套接字。

除了发布/订阅模式,还有其他的消息传递方式,比如请求/响应(req/resp)或者推送/拉取(push/pull)。

虽然我对你的应用了解不多,但我可以提供一个示例,展示如何在Python中使用ZeroMQ集成锁管理器

使用ZeroRPC

有一个实验性的Golang库,可以通过ZeroMQ与Python和Node.js代码进行通信,具体可以参考zerorpc.dotcloud.com

在Python中编写可以通过ZeroRPC调用的函数非常简单,实际上你根本不需要写一行关于zeromq的代码(有一个命令行工具,可以帮助你集成具有正确格式的函数)。

撰写回答