iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python调用golang并回调
  • 830
分享到

python调用golang并回调

回调pythongolang 2023-01-31 04:01:35 830人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

最近折腾python交互,也真够呛的,一连玩了好几天,被虐的不要不要的。天天各种百度,Google之间。好吧,废话少说,转入我们的正题。其实,py调用go一般的函数,只是第一道坎,正主其实是py调用go,并且go还回调py!!!网上其实这

最近折腾python交互,也真够呛的,一连玩了好几天,被虐的不要不要的。天天各种百度,Google之间。

好吧,废话少说,转入我们的正题。其实,py调用go一般的函数,只是第一道坎,正主其实是py调用go,并且go还回调py!!!

网上其实这些问题很少,而且有且只有一篇关于go回调py的。

就是如下一位大兄弟写的:https://www.golangtc.com/t/59f858c04ce40d3bf47f5fbc


虽说他是说解决了,问题是下面的解决方案写的真心有问题啊。。。其实,py调用go,他们是通过c来进行桥接(应该是这么说吧),py<——>c<——>go,就是说,py一直认为自己是调用c,go也是如此,并不知其实他们是在互相操作。。。

那么,好办了,py调用go并且回调,在py侧,只要按照py调用c,并且回调就可以了。go侧则go调用c,并且回调c,就可以了。

其实py侧很简单,随便百度一下,应该是正确的。上面那大兄弟写的方法就可以了。问题是go侧,真心坑。。。


当py传入自己的回调,其实是被c包装了一下,然后,go这边接收的其实就是一个c的函数指针!在go里面,c的函数指针,其实就是一个unsafe.Pointer,一个unsafe.Pointer,一个unsafe.Pointer,重要的事情说三次!!!但go获得这东西,它只知道是一个地址啊,不知道是一个什么东西。。。好吧,只能把它重新转回c的函数指针,但这个过程必须要靠一个c函数做过渡!!!!


然而,这样就出现一个坑了!!!那个c函数定义,居然不能跟导出的go函数写在同一个go文件里面!!!否则,会一直报重复定义的错误,呵呵。于是乎,只能这么弄,分三个文件:一个.h文件,两个.go文件。

clib.h

#ifndef CLIB_H
#define CLIB_H
typedef void (*callback)(int);
#endif

这是定义回调结构的。


clibh.go

package main


import "C"

这是定义go调用c函数的,而且这个必须要有,用来间接调用c回调(py回调)的。


main.go

package main


import "C"
import (
   "unsafe"
)

//export TestCB
func TestCB(a, b int, cb unsafe.Pointer){
   c:=a+b
   
   C.TestCCB(C.int(c), (*[0]byte)(cb))
}

func main() {
}

然后这个,是导出我们的正主:TestCB。其中的参数,cb就是针对c(py)回调的,在函数体里面,其实用TestCCB(中间c函数)来调用这个回调,注意:上方extern void TestCCB(int c, callback cb);只能这么弄了,不能直接在这个.go文件写它的定义。我就是为此折腾了好些天的,直接在里面定义c中间函数,就直接报重复定义了。


然后,编译命令要注意了:

go build -ldflags=-s -buildmode=c-shared -o foo.so clibh.go main.go

两个.go文件,必须要写出来!就是上面那大兄弟说的连个go,当时我看着他说的这个名词,愣了半天,不知他说啥。。。其实就是把该编译的go都写吧。。。不知为啥go编译的时候,不会主动把同一个包的代码都编译在一起。。。随便,能用就行。。。


接下来,在py侧,就很简单了。。。

import ctypes

lib = ctypes.CDLL('./foo.so')

CGOFunc = ctypes.CFUNCTYPE(None, ctypes.c_int32)

def GoCB(c):
    print("c =", c)

cb = CGOFunc(GoCB)
lib.TestCB(5, 6, cb)

这个网上都有说,其实就是py调用c接口,然后c又回调py函数的做法。。。以上。


参考了几个网址:

Https://www.golangtc.com/t/59f858c04ce40d3bf47f5fbc

https://GitHub.com/golang/go/wiki/cgo#function-pointer-callbacks

https://xiaowing.github.io/post/howto_call_a_go_func_via_funcpoint_from_cside/

https://studygolang.com/articles/2629


--结束END--

本文标题: python调用golang并回调

本文链接: https://www.lsjlt.com/news/188028.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python调用golang并回调
    最近折腾python交互,也真够呛的,一连玩了好几天,被虐的不要不要的。天天各种百度,Google之间。好吧,废话少说,转入我们的正题。其实,py调用go一般的函数,只是第一道坎,正主其实是py调用go,并且go还回调py!!!网上其实这...
    99+
    2023-01-31
    回调 python golang
  • Golang调用Python
    摘要: Python是时髦的机器学习御用开发语言,Golang是大红大紫的新时代后端开发语言。Python很适合让搞算法的写写模型,而Golang很适合提供API服务,两位同志都红的发紫,这里就介绍一下正确搅基的办法。 ![干他一炮...
    99+
    2023-01-31
    Golang Python
  • golang异步回调怎么实现
    在Go语言中,可以使用goroutine和channel来实现异步回调的功能。 首先,我们可以创建一个goroutine来执行异步的...
    99+
    2023-10-25
    golang
  • golang怎么调用python脚本
    在Golang中调用Python脚本可以使用os/exec包来执行外部命令。下面是一个简单的示例代码:gopackage maini...
    99+
    2023-10-20
    golang python
  • Golang函数的回调函数应用讲解
    Golang作为一门高效的编程语言,其函数的回调函数应用极为重要,因此在本篇文章中,我们将深入讲解Golang函数的回调函数应用的相关知识。一、什么是回调函数?回调函数就是函数指针,它作为参数直接传给其他函数。当这个参数函数执行完毕后,再回...
    99+
    2023-05-16
    Golang函数 回调函数 应用讲解
  • callback回调函数--python
    编程分为两类:系统编程(system programming)和应用编程(application programming)。所谓系统编程,简单来说,就是编写库;而应用编程就是利用写好的各种库来编写具某种功用的程序,也就是应用。系统程序员会...
    99+
    2023-01-30
    回调 函数 callback
  • Golang函数的并发调用实践分享
    作为一门高效、轻量、并发支持良好的编程语言,Golang 的函数并发调用是一项很重要的特性。在这篇文章中,本文将分享一些关于 Golang 函数并发调用的实践经验,希望能对 Golang 开发者有所帮助。一、Goroutine 的使用Gor...
    99+
    2023-05-18
    Golang 并发调用 实践分享
  • python 回调函数和回调方法的实现分析
    回调与事件驱动 回调函数有比较重要的意义:它在是事件驱动的体现 我们试想一个场景,如果我们触发了某个事件,比如点击事件 那么只要给这个点击事件绑定一个或多个处理事件,也就是回调函数 我们就可以在点击事件被触...
    99+
    2022-06-04
    回调 函数 方法
  • golang异步回调数据怎么实现
    在Go语言中,可以使用协程(goroutine)和通道(channel)来实现异步回调数据的功能。 首先,定义一个函数,该函数用于执...
    99+
    2023-10-27
    golang
  • golang过程调用
    Golang是一种快速、高效的开发语言,已经成为了著名的编程语言之一。在Golang中,过程调用是一项非常重要的功能,也是必须掌握的技能之一。在本文中,我们将详细介绍Golang中的过程调用,并且介绍一些相关的最佳实践和最新的技术。什么是过...
    99+
    2023-05-22
  • golang方法调用
    Go语言是一门高效、简洁、可靠的编程语言,近年来备受开发者们的青睐。在Go语言中,方法调用是一种常见的操作,在许多应用程序中都扮演着重要的角色。本文将深入探讨Go语言中方法调用的基本原则、语法规则以及实践技巧。一、基本原则在Go语言中,方法...
    99+
    2023-05-16
  • golang基于errgroup实现并发调用的方法
    目录串行调用基于sync.WaitGroup实现简单的并发调用基于errgroup.Group实现并发调用总结串行调用 在用go编写web/rpc服务器的时候,经常会出现需要对下游多...
    99+
    2022-11-11
  • JavaScript如何禁用回调列表中的回调
    本篇内容介绍了“JavaScript如何禁用回调列表中的回调”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2022-10-19
  • golang调度如何用
    这篇文章主要介绍了golang调度如何用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇golang调度如何用文章都会有所收获,下面我们一起来看看吧。调度器概述Golang调度器是Golang运行时系统中的一个组...
    99+
    2023-07-05
  • golang怎么调用ffmpeg
    在Go语言中调用FFmpeg,需要借助外部命令执行的方式,可以使用os/exec包来执行FFmpeg命令。首先,确保已经安装了FFm...
    99+
    2023-10-20
    golang
  • golang方法调用栈
    Golang作为一门高性能、简洁的编程语言,受到了越来越多程序员的关注和喜爱。在编写Golang程序时,我们经常会使用方法来组织代码,提高程序的可读性和可维护性。但是,在实际的开发过程中,我们很容易遇到方法调用栈溢出的问题。本文将重点介绍G...
    99+
    2023-05-15
  • golang怎么调用dll
    Golang作为编程语言,其强大的并发能力和高效的性能广受开发者的喜爱。在实际开发中,我们可能会涉及到和DLL(dynamic-link library)文件的交互,如何在Golang中调用DLL成为了一个重要问题。本文将介绍Golang如...
    99+
    2023-05-14
  • golang 包方法调用
    Go语言是一种越来越受欢迎的编程语言,它的一个独特之处在于其强大的包管理系统。包是Go语言最重要的概念之一,它为我们提供了抽象出代码单元的方法,并提供了代码复用的机制。本文将介绍如何调用包方法,并深入探讨Go语言包管理系统的优势。Go语言中...
    99+
    2023-05-14
  • golang不同包调用
    Go语言是一种开源的编程语言,它的出现有着很多优点,其中包括静态类型检查、垃圾回收和协程等。在使用Go语言进行开发时,使用不同包的函数和变量是一个常见的需求。本文将介绍一些关于Go语言不同包调用的方法和技巧。导入需要的包在Go语言中,我们需...
    99+
    2023-05-14
  • Java调用Python脚本传递数据并返回计算结果
    需求:最近在使用基于Java编写的Cloudsim 4.0云仿真平台进行虚拟机动态迁移实验,由于中间有需要用到深度强化学习算法,因此需要将集群的状态表示为二维数组,比如物理机的计算能...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作