gpt4 book ai didi

python-2.7 - 在 Python 中使用 Golang 方法时内存不足

转载 作者:IT王子 更新时间:2023-10-29 02:19:14 31 4
gpt4 key购买 nike

我一直在关注这个 https://medium.com/learning-the-go-programming-language/calling-go-functions-from-other-languages-4c7d8bcc69bf

现在,我正在做的是:-

  • 传递一个 Json 字符串
  • 使用带有 Go 结构引用和字符串的 Json Unmarshall
  • 执行业务逻辑和运营
  • 将结构编码为 JSON 字符串
  • 返回

现在,我面临的问题是在通过 python 运行它时出现Out-of-Memory 异常。如果我通过普通 Go 运行它,那么它运行良好。

此外,如果我不解码,只是正常初始化结构,那么我没有问题,并得到一个 json 字符串。但我需要在两者之间传递结构化数据。

问题出现在Unmarshal Line

func BuildCRMLinkFromJSON(jsonstring string) CRMLinkBO {
var crmLink CRMLink = CRMLink{}
json.Unmarshal([]byte(jsonstring), &crmLink)
var clb = CRMLinkBO{crmLink: crmLink}
return clb
}

运行时错误是:

runtime: out of memory: cannot allocate 140328041390080-byte block (66781184 in use)
fatal error: out of memory

Shauryas-MacBook-Pro:go-python-interfacing xuryax$ python pythonclient.py 
unexpected fault address 0x210c1a334
fatal error: fault
[signal SIGSEGV: segmentation violation code=0x1 addr=0x210c1a334 pc=0x1087b0c75]

最小复制:usego.go

package main

import (
"encoding/json"
"fmt"
)

import "C"

// Data Model

type CustomField struct {
Field string `json:"field"`
Value string `json:"value"`
}

type PersonDetails struct {
Person_id string `json:"person_id"`
Detail []CustomField `json:"detail"`
}

func New(pid string) PersonDetails {
var p = PersonDetails{"HARDCODED PID IN GO", []CustomField{}}
return p
}

func BuildFromJSON(jsonString string) PersonDetails {
var person_detail PersonDetails = PersonDetails{}
json.Unmarshal([]byte(jsonString), &person_detail)
return person_detail
}

func ConvertToJSON(p PersonDetails) string {
fmt.Println(p)
var je, _ = json.Marshal(p)
return string(je)
}

func AddValue(p PersonDetails) PersonDetails {
var CustField = CustomField{"Hardcoded Field in Go", "Hardcoded Value in Gos"}
p.Detail = append(p.Detail, CustField)
return p
}

//export DoJSONOperation
func DoJSONOperation(jsonString string) *C.char {
var p = BuildFromJSON(jsonString)
p = AddValue(p)
var nstr = ConvertToJSON(p)
return C.CString(nstr)
}

//export DoNormalOperation
func DoNormalOperation(jsonString string) *C.char {
var p = New(jsonString)
p = AddValue(p)
var nstr = ConvertToJSON(p)
fmt.Println("Before Return: ", string(nstr))
return C.CString(nstr)
}

func main() {
// DO noting
// var jsonStr = `{"person_id":"JsonID","detail":[{"field":"json passed field", "value":"json passed value"}]}`
}

Python客户端.py

from ctypes import *
import json

def main():
lib = cdll.LoadLibrary("/Users/xuryax/work/repos/research/go-python-interfacing/usego.so")

lib.DoJSONOperation.argtypes = [c_char_p]
lib.DoJSONOperation.restype = c_char_p

json_string = """{"person_id":"PythonJsonID","detail":[{"field":"json passed field", "value":"json passed value"}]}"""
normal_pid = "Python ID"
updated_json = lib.DoNormalOperation(normal_pid)

print(updated_json)


if __name__=="__main__":
main()

奇怪的是,如果我使用硬编码的那个,它会返回 Pointer(integer),但在我之前的实验中,我确实得到了一个字符串。

最佳答案

其实答案看起来很简单。我错过了类型转换的问题。

该方法应该接受*C.char

//export DoJSONOperation
func DoJSONOperation(jsonString *C.char) *C.char {
var GoString = C.GoString(jsonString)
var p = BuildFromJSON(GoString)
p = AddValue(p)
var nstr = ConvertToJSON(p)
return C.CString(nstr)
}

这似乎解决了问题。

在 Python 中,我们也需要进行类型转换。而不是发送 Python 字符串,我们需要发送。c_char_p(jsonString)

关于python-2.7 - 在 Python 中使用 Golang 方法时内存不足,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55772793/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com