【问题标题】:Simplest pub-sub for golang <--> python communication, possibly across machines?golang <--> python 通信的最简单的发布-订阅,可能跨机器?
【发布时间】:2014-07-16 21:30:09
【问题描述】:

我正在开发一个用 Golang 编写的 Web 应用程序,它需要调用 Python 程序/模块来完成一些繁重的工作。由于这非常占用内存/CPU,因此它可能位于单独的机器上。由于 Golang 和 Python 不能直接对话,所以有 3 种方法可以实现:

  1. 只需将 python 程序作为 OS 进程从 Go(如果在同一台机器上)(或 RPC?)执行
  2. 将 Python 进程包装在一个服务中并公开它以供从 Go 调用(可能是一个简单的 CRUD 类服务 - 一个 Bottle/flask RESTful 服务)
  3. 有一个简单的 pub-sub 系统来实现这一点(Redis 或一些 MQ 系统) - 添加基于 Redis 的缓存是在雷达上,所以可能是这样做的一个很好的理由。不确定。

主要的是,需要很长时间才能完成的 Python 进程必须“通知”Web 应用程序它已经完成。数据可以在文件/数据库中,也可以由进程“返回”。

在类似 pub/sub 的环境中实现这一目标的最简单方法是什么?

更新 REST 似乎是一种方式,但会产生实现服务器端推送的成本,这对于现有的微型 Web 框架可能会或可能不会轻松实现。尽管如此,发布/订阅会为可维护性和学习曲线增加一层额外的复杂性。我不确定是否可以跨机器实现类似 RPC 的调用。在这方面有什么好的选择?

【问题讨论】:

    标签: python python-2.7 go publish-subscribe


    【解决方案1】:

    使用 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 编写一行代码(有命令行工具,它允许将函数与适当形状的签名集成)。

    【讨论】:

    • 从可维护性和经济角度来看,是否值得开销?这是一个非常小的用例。
    • @PhD 使用 ZeroMQ 有什么代价?从技术上讲,它非常快,不会消耗太多内存,您将很难找到技术上更有效的方法。如果问题是针对 pub/sub,你有更好的报价吗? Redis 比较大,必须安装。 Db 需要一个文件。
    • @PhD 刚刚添加了另一个答案的链接,显示使用 zeromq 进行集成。只需计算通信所需的线路。除了为 Python 安装了 pyzmq 库和为 Go 安装了类似的库之外,无需设置和维护。
    • @PhD 添加了 ZeroRPC 解决方案。我无法评估 Golang 部分的实验性如何,但我已经尝试了 Python 部分,它很棒 - 只需重复 (ZeroRPC README](github.com/dotcloud/zerorpc-python) 中的示例,您就会明白我的意思。跨度>
    【解决方案2】:

    对于您的特定模式,简单地从 Go 生成进程并读取标准输出是最有效的,没有必要添加开销。

    这在很大程度上取决于您的 python 脚本的作用,如果它是一项特定任务,那么只需生成进程并检查退出代码就足够了,如果您必须始终将脚本保持在后台并与那么 Redis 或 ZeroMQ 都很好,并且在 Go 和 Python 上都非常成熟。

    如果它在不同的服务器上,那么 ZeroMQ/RPC 或只是 python 中的普通 http 服务器应该没问题,开销应该是最小的。

    【讨论】:

    • 它并没有真正向标准输出写入任何内容,我们也不需要它。我明白你的意思,并倾向于依靠这一点。但是将来有可能将 Redis 添加到应用程序中,我想知道我是否应该走这条路。
    • 这在很大程度上取决于您的 python 脚本的功能,如果它是一项特定任务,那么只需生成进程并检查退出代码就足够了,如果您必须将脚本保持在后台一直与它通信,那么 Redis 或 ZeroMQ 都很好,并且在 Go 和 Python 上都非常成熟。
    • 这是一个巨大的内存密集型任务,将在单独的机器上运行以防止 golang 服务器变慢。所以产生一个单独的进程可能不是最好的主意
    • 然后 ZeroMQ/RPC 和/或 python 中的普通 http 服务器应该没问题,开销应该是最小的。
    • 能否将您的最后一条评论添加到答案中,以便我继续接受它?
    猜你喜欢
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2013-06-28
    相关资源
    最近更新 更多