我一直在使用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)
}
答案 0 :(得分:5)
它们之间需要 glue ,例如C
编程语言或通过网络进行通信。
如果你将https://docs.python.org/2/extending/extending.html和http://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.Stdin
和os.Stdout
)进行通信。你必须发明一个双方都同意的协议(看起来你已经确定了JSON)并且不要忘记在从两端流式传输逻辑原子请求后刷新流。
通过这种方式,您的解决方案(几乎)是跨平台的,并且非常容易设置。