我正在开发一个用 Golang 编写的 Web 应用程序,它需要调用 Python 程序/模块来完成一些繁重的工作。由于那是非常内存/CPU 密集型的,它可能在单独的机器上。由于 Golang 和 Python 不能直接对话,有 3 种方法可以实现这一点:
- 只需将 python 程序作为操作系统进程从 Go 执行(如果在同一台机器上)(或 RPC?)
- 将 Python 进程包装在一个服务中并公开它以便从 Go 调用它(可能是一个简单的 CRUD 类服务 - A Bottle/flask restful 服务)
- 有一个简单的发布-订阅系统来实现此目的(Redis 或某些 MQ 系统)- 添加基于 Redis 的缓存正在考虑中,因此可能是采用这种方式的一个很好的理由。不确定。
最主要的是,需要很长时间才能完成的 python 进程必须“通知”Web 应用程序它已经完成。数据可以在文件/数据库中,也可以由进程“返回”。
在类似发布/订阅的环境中实现这一目标的最简单方法是什么?
更新 REST 似乎是一种方式,但会产生实现服务器端推送的成本,这可能会或可能不会通过现有的微型 Web 框架轻松实现。尽管如此,发布/订阅会为可维护性和学习曲线增加一层额外的复杂性。我不确定是否可以跨机器实现类似 RPC 的调用。在这方面什么是好的选择?
最佳答案
使用 ZeroMQ
Python 有很好的 pyzmq
GO bindngs也存在。
ZeroMQ 代码通常简短而有效。
您甚至可以在 Unix 上使用本地套接字。
除了 pub/sub 之外,还有其他消息传递模式,您可以使用 req/resp 或 push/pull。
不太了解您的应用程序,我可以提供集成示例 lock manager using zeromq in Python
使用 ZeroRPC
有experimental Golang lib能够通过 ZeroMQ 与 Python 和 Node.js 代码通信,如图所示(对于 Python 和 Node.js)zerorpc.dotclould.com
用 Python 编写可通过 ZeroRPC 调用的函数非常简单 - 事实上,您不必使用 zeromq 编写一行(有命令行工具,它允许将函数与适当形状的签名集成)。
关于python - golang <--> python 通信的最简单的 pub-sub 通信,可能跨机器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24791113/