V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xmge
V2EX  ›  程序员

go 语言对接 c 语言的问题

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

    项目背景:

    刚刚入职的新公司,想要将之前的 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   ·   实用小工具   ·   2803 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 00:09 · PVG 08:09 · LAX 16:09 · JFK 19:09
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.