混合Python和Go

时间:2014-04-26 16:51:35

标签: python go

我一直在使用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 个答案:

答案 0 :(得分:5)

它们之间需要 glue ,例如C编程语言或通过网络进行通信。 如果你将https://docs.python.org/2/extending/extending.htmlhttp://golang.org/cmd/cgo/以及C中的良好编程技巧相结合,那么最痛苦的解决方案。

您可以在python http://pymotw.com/2/socket/tcp.html和go https://coderwall.com/p/wohavg中创建服务器并在它们之间进行通信。

修改 请参阅Writing a Python extension in Go (Golang)Calling Python function from Go and getting the function return value

答案 1 :(得分:1)

混合语言的最简单方法是通过套接字(如TCP / IP或Unix域套接字)或通过HTTP或XML-RPC等高级协议进行通信。由于JSON / XML的请求处理和序列化/反序列化,这会带来非常高的开销,如果您需要进行大量调用,这可能很重要。如果每个请求的工作负载量很高,通过套接字进行通信通常是最好的。

如果你不愿意支付套接字的开销(比如说你在python和每秒之间来回发出数千个请求),那么其他解决方案可能会有更低的开销。您可以在拥有它们的操作系统中使用共享内存。共享内存通常会导致访问数据的成本更低,但它可能会导致从共享内存结构到Python数据类型的装箱/拆箱成本。另请注意,您可能需要自行管理锁。

除非您只进行非常少量的呼叫,并且他们不需要在呼叫之间共享状态,否则我不建议使用标准的stdin / stdout进行通信。

最后一种方法是编写Python扩展;我不会为胆小的人推荐这个。

答案 2 :(得分:0)

最简单的解决方案是从Python生成Go流程,并通过Go的流程标准流(os.Stdinos.Stdout)进行通信。你必须发明一个双方都同意的协议(看起来你已经确定了JSON)并且不要忘记在从两端流式传输逻辑原子请求后刷新流。

通过这种方式,您的解决方案(几乎)是跨平台的,并且非常容易设置。