Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
golang最简单的酒吧酒吧酒吧<--&燃气轮机;python通信,可能是跨机器的?_Python_Python 2.7_Go_Publish Subscribe - Fatal编程技术网

golang最简单的酒吧酒吧酒吧<--&燃气轮机;python通信,可能是跨机器的?

golang最简单的酒吧酒吧酒吧<--&燃气轮机;python通信,可能是跨机器的?,python,python-2.7,go,publish-subscribe,Python,Python 2.7,Go,Publish Subscribe,我正在开发一个用Golang编写的web应用程序,它需要调用Python程序/模块来完成一些繁重的工作。因为这是非常内存/CPU密集型的,所以它可能位于单独的机器上。由于Golang和Python不能直接对话,因此有3种方法可以实现这一点: 只需从Go(如果在同一台机器上)(或RPC?)将python程序作为操作系统进程执行即可 将Python进程包装到服务中,并将其公开,以便从Go调用(可能是一个简单的CRUD类服务—瓶/瓶restful服务) 有一个简单的发布子系统来实现这一点(Redis或

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

  • 只需从Go(如果在同一台机器上)(或RPC?)将python程序作为操作系统进程执行即可
  • 将Python进程包装到服务中,并将其公开,以便从Go调用(可能是一个简单的CRUD类服务—瓶/瓶restful服务)
  • 有一个简单的发布子系统来实现这一点(Redis或一些MQ系统)——添加基于Redis的缓存是一个很好的理由。不确定
  • 最主要的是,需要很长时间才能完成的python进程必须“通知”web应用程序它已经完成。数据可以在文件/DB中,也可以由进程“返回”

    在类似酒吧/酒吧的环境中,最简单的方法是什么

    更新 REST似乎是一种方法,但会带来实现服务器端推送的成本,这在现有的MicroWeb框架中可能很容易实现,也可能不容易实现。发布/订阅将为可维护性和学习曲线增加额外的复杂性。我不确定是否可以跨机器实现类似RPC的调用。在这方面,什么是一个好的选择?

    使用ZeroMQ Python有很好的
    pyzmq

    也存在

    ZeroMQ代码通常简短有效

    您甚至可以在Unix上使用本地套接字

    除了pub/sub之外,还有其他消息传递模式,您可以使用req/resp或push/pull

    由于不太了解您的应用程序,我可以提供集成的示例

    使用ZeroRPC 可以通过ZeroMQ与Python和Node.js代码通信,如图所示(对于Python和Node.js)


    用Python编写可通过ZeroRPC调用的函数非常简单-事实上,您不必使用zeromq(有命令行工具,它允许将函数与正确形状的签名集成在一起)编写一行。

    对于您的特定模式,只需从Go生成进程并读取stdout是最有效的,没有必要在头上加一个


    这在很大程度上取决于python脚本的功能,如果它是一个特定的任务,那么只需生成流程并检查退出代码就足够了,如果您必须始终将脚本保留在后台并与之通信,那么Redis或ZeroMQ是不错的,在Go和python上都非常成熟


    如果它位于不同的服务器上,那么ZeroMQ/RPC或python中的普通http服务器就可以了,开销应该最小

    它并没有写任何东西给stdout,我们也不需要它。我明白你的意思,倾向于依靠这个。但将来有可能将Redis添加到应用程序中,我想知道我是否应该这样做。这在很大程度上取决于python脚本的功能,如果是一项特定任务,那么只需生成流程并检查退出代码就足够了,如果您必须始终将脚本保存在后台并与之通信,那么Redis或ZeroMQ很好,在Go和Python上都非常成熟。这是一项巨大的内存密集型任务,将在单独的机器上运行,以防止golang服务器的速度减慢。因此,生成一个单独的进程可能不是最好的主意ZeroMQ/RPC和/或python中的纯http服务器应该可以,开销应该是最小的。能否请您在回答中添加您的最后一条评论,以便我可以继续接受它?从可维护性和经济角度来看,它值得开销吗?这是一个非常小的用例。@PhD使用ZeroMQ的代价是什么?从技术上讲,它非常快,不消耗太多内存,而且您将很难找到技术上更有效的方法。如果问题是酒吧/酒吧,你有更好的报价吗?Redis更大,必须安装。Db需要一个文件。@PhD刚刚添加了指向另一个答案的链接,显示了使用zeromq的集成。只需计算通信所需的线路。除了为Python安装pyzmq库和为Go安装类似的库之外,没有更多的设置和维护了。@PhD添加了ZeroRPC解决方案。我无法评估Golang部分的实验性,但我已经尝试了Python部分,它非常棒-只要重复(ZeroRPC自述)中的示例,您就会理解我的意思。