go 语言对接 c 语言的问题 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不在回答技术问题时复制粘贴 AI 生成的内容
xmge
V2EX    程序员

go 语言对接 c 语言的问题

  •  
  • /a>
      xmge 2020-04-29 14:29:36 +08:00 3691 次点击
    这是一个创建于 1994 天前的主题,其中的信息可能已经有所发展或是发生改变。

    项目背景:

    刚刚入职的新公司,想要将之前的 c 语言的项目陆续改为 go 语言的。现在需要写一个 go 调用 c 的接口的实现方案。考虑过以下几个方面:

    解决方案:

    1 、c 语言搭建 http 服务,直接调用。

    c 语言同事那边说,c 写的 http 服务,第一不稳定,第二性能差。遂放弃。

    2 、用 linux 系统内消息队列进行通信。

    之前的同事写了一般,但是 需要用到 cgo 调用 c 的命令来做,但是调用过程没办法设置超时时间,而且 cgo 调用类似于阻塞 IO,它们在操作期间消耗一个系统线程。性能也不会很好

    相关技术文章: https://www.jianshu.com/p/7e3045cf1ab8

    3 、用 gprc 来通信

    这个协议很靠谱,之前也用过,但是在调研过程中公司之前环境上 C/C++ 无法编译一些 ProtoBuf 文件,公司同事说,这个也不用考虑了。

    4 、zmq 通过 zmq 来进行系统间通信

    通过一种无需安装服务的消息队列的方式,这个正在调研

    5 、json-rpc

    这个正在等同事的消息。

    大佬们有没有什么建议呢?

    22 条回复    2020-04-30 14:47:48 +08:00
    noisywolf
        1
    noisywolf  
       2020-04-29 15:44:13 +08:00
    用 cgo 调用 c 写的模块
    BlackBerry999
        2
    BlackBerry999  
       2020-04-29 15:46:54 +08:00
    go 是可以执行命令的 c 那边可否改为执行命令?
    noisywolf
        3
    noisywolf  
       2020-04-29 15:51:17 +08:00
    rrfeng
        4
    rrfeng  
       2020-04-29 15:57:13 +08:00
    1 不稳定???性能差???
    xmge
        5
    xmge  
    OP
       2020-04-29 15:58:33 +08:00
    @rrfeng 对 c 语言不太了解,如果可以用 http,那就简单很多了。
    xmge
        6
    xmge  
    OP
       2020-04-29 16:02:11 +08:00
    @noisywolf 大佬,在调用过程中如何设置超时时间呢,比如调用时,c 那边程序阻塞了,go 这边调用的协程可以直接返回吗?
    cgo 的会占用一个线程,如果阻塞几个,程序就停了。
    qq1340691923
        7
    qq1340691923  
       2020-04-29 16:02:39 +08:00
    @xmge php7 了解一下
    xmge
        8
    xmge  
    OP
       2020-04-29 16:10:49 +08:00
    @qq1340691923 ??? 我们用的 go 啊。
    neoblackcap
        9
    neoblackcap  
       2020-04-29 16:15:14 +08:00
    有那么多 C 写的 http server 整天在跑着,我都不知道 C 怎么就性能差了
    如果是上 zmq 的话,你就得自己维护消息队列的深度了,要不然信息多会爆。你们是 C 写的话,其实可以用 nanomsg,可能会更好
    pmispig
        10
    pmispig  
       2020-04-29 16:18:15 +08:00
    @rrfeng 哈哈,我都是惊讶了,在想楼主是不是反过来了
    reus
        11
    reus  
       2020-04-29 16:20:03 +08:00 via Android
    @xmge 占用线程有什么问题?你用 C/C++写难道就不是占用线程?阻塞几个就停了?建议学习下 go 调度器的基本知识再下判断。或者写个 demo 来验证自己的想法是对是错。
    Leigg
        12
    Leigg  
       2020-04-29 16:20:54 +08:00 via Android
    c 性能差???
    reus
        13
    reus  
       2020-04-29 16:25:43 +08:00 via Android
    另外 linux ipc 直接用 syscall 包就行,不需要 cgo 。我看你这个同事也有点菜吧。

    如果用 cgo,就是直接调 c 的函数,不需要 ipc
    boboliu
        14
    boboliu  
       2020-04-29 16:27:55 +08:00
    不是很懂需求,不过看起来应该可以直接 cgo,只是复杂性可能会变得一言难尽 那就不算重构了
    zjsxwc
        15
    zjsxwc  
       2020-04-29 16:31:36 +08:00
    c 语言写的不怕内存泄露吗
    xmge
        16
    xmge  
    OP
       2020-04-29 16:32:51 +08:00
    @pmispig 额。没写过 c,同事说的。我感觉 c 偏底层,应该更快的啊。
    useben
        17
    useben  
       2020-04-29 16:41:28 +08:00
    go 调用 so 就行, 我这里的图像识别算法都是封装成 so 给我 go 用的
    gamexg
        18
    gamexg  
       2020-04-29 16:41:54 +08:00
    需求简单 c 语言直接封装成 dll,go 去调用。go 也可以直接内嵌 c 代码。

    不过如果对同事信心不足,那么还是隔离开不要一个进程内好。

    @xmge #6
    >cgo 的会占用一个线程,如果阻塞几个,程序就停了。

    不会,没大印象了,但是记得 go 的 syscall 调用诸塞时会自动建立新的操作系统线程,不会出现出现 c 代码把所有操作系统线程占据的情况。
    buzailianxi
        19
    buzailianxi  
       2020-04-29 19:46:37 +08:00 via Android
    都是甩锅,直接调 clib 把省事
    join
        20
    join  
       2020-04-29 21:09:55 +08:00
    读业务逻辑全部重写,想啥呢?
    Chenamy2017
        21
    Chenamy2017  
       2020-04-30 11:51:31 +08:00
    说 C 写的 http 不稳定和性能差的我估计是说他自己写的代码吧。自己写当然差了,但是别人写的 nginx 就不一样了。
    ddoocc
        22
    ddoocc  
       2020-04-30 14:47:48 +08:00
    封装成 lib 直接调用啊,任何现代语言都兼容 c abi 。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2967 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 14:10 PVG 22:10 LAX 07:10 JFK 10:10
    Do have faith in what you're doing.
    ubao snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86