go 写网络基础, Python 写逻辑,两种语言如何结合写项目? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
zzlettle
V2EX    Go 编程语言

go 写网络基础, Python 写逻辑,两种语言如何结合写项目?

  •  
  •   zzlettle 2020-11-17 13:31:45 +08:00 5233 次点击
    这是一个创建于 1821 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近开发一个后端服务器,游戏的
    GO 比较适合来写网络交互的
    但是写逻辑比较蛋疼
    python 这样的语言适合写逻辑
    所以想看看有什么方法把两种语言在项目中混合起来开发
    但是以前没有做过,没有经验
    大家有做过类似项目的,能指点下吗
    32 条回复    2020-11-27 17:59:58 +08:00
    liujavamail
        1
    liujavamail  
       2020-11-17 13:37:48 +08:00
    grpc
    anUglyDog
        2
    anUglyDog  
       2020-11-17 13:39:58 +08:00   2
    别折腾!别折腾!别折腾!
    misaka19000
        3
    misaka19000  
       2020-11-17 13:41:11 +08:00
    Unix domain socket
    PureWhiteWu
        4
    PureWhiteWu  
       2020-11-17 13:42:20 +08:00
    游戏后端服务器,用 Python……认真的么……
    a554340466
        5
    a554340466  
       2020-11-17 13:44:26 +08:00 via iPhone
    c++ + lua
    xx6412223
        6
    xx6412223  
       2020-11-17 13:44:36 +08:00
    这么做就是自己把自己搞死
    index90
        7
    index90  
       2020-11-17 13:51:16 +08:00
    rpc 要做多一次序列化和反序列化,如此浪费不可取

    可以考虑一下 go 编译成动态库,然后在 python 里面用
    joesonw
        8
    joesonw  
       2020-11-17 14:05:59 +08:00
    golang skylark

    skylark 是 babel 用的语言, 是 python 的 subset. 如果只是写逻辑的话可以试一试, 做个 benchmark 看一看
    joesonw
        9
    joesonw  
       2020-11-17 14:06:10 +08:00
    @joesonw 修正, babel -> bazel
    Kamiyu0087
        10
    Kamiyu0087  
       2020-11-17 14:31:37 +08:00
    不会 GO 也不会 Python 的能问下为啥 Python 更适合写逻辑?
    TypeError
        11
    TypeError  
       2020-11-17 14:35:08 +08:00
    静态类型语言动态脚本嵌入,应该是游戏服务器主流做法吧
    某个挺出名的游戏后端框架 skynet 就是这么做的
    可以参考楼上说的 skylark
    cmdOptionKana
        12
    cmdOptionKana  
       2020-11-17 14:38:48 +08:00
    @Kamiyu0087 动态语言、鸭子类型,写业务逻辑是可以很爽,更何况 Go 目前还没有泛型,因此 Go 写业务会有点麻烦。

    但话又说回来,动态语言如果不认真写 unittest, 维护起来就很容易出问题了,因此也有人说 “动态一时爽,重构火葬场”,就是这个意思。
    qieqie
        13
    qieqie  
       2020-11-17 15:19:49 +08:00
    cgo
    c shared library
    python ctypes
    觉得 ctypes 写着麻烦的话也有通过 header 自动生成的工具
    xulolololololo
        14
    xulolololololo  
       2020-11-17 15:26:51 +08:00
    不知道你要什么级别的性能,python asyncio 异步协程已经很成熟,现在瓶颈一般都是网络 io 和数据库 io 了吧
    paoqi2048
        15
    paoqi2048  
       2020-11-17 15:55:10 +08:00
    @PureWhiteWu 用 Python 的
    paoqi2048
        16
    paoqi2048  
       2020-11-17 16:02:13 +08:00
    带 gc 的 Python 调用带 gc 的 Go 提供的库,这样不太稳吧?
    ytymf
        17
    ytymf  
       2020-11-17 16:05:28 +08:00
    @PureWhiteWu 网易有话说。。
    est
        18
    est  
       2020-11-17 16:25:44 +08:00
    你以为的性能问题:网络处理能力不行

    实际上的性能问题:DB 存取和外部 IO 一塌糊涂
    a719114136
        19
    a719114136  
       2020-11-17 16:27:50 +08:00
    比较成熟的方案就 rpc 。不过同意楼上的别折腾,老老实实用 go 吧
    xuanbg
        20
    xuanbg  
       2020-11-17 16:32:04 +08:00
    Python 写游戏?楼主你是认真的吗?
    magiclz233
        21
    magiclz233  
       2020-11-17 17:09:04 +08:00
    为啥不直接都用 go 呢,业务用 python 的好处是啥,go+python 比纯 go 的优点在哪
    Vegetable
        22
    Vegetable  
       2020-11-17 17:12:08 +08:00
    PEIENYKYK
        23
    PEIENYKYK  
       2020-11-17 17:12:12 +08:00
    现在就在这么开发项目,说一下我的处理逻辑吧

    1. RPC 这个是完完全全的方案,而且还涉及到旧代码屎山
    2. 编译 Go 直接 Python 调用
    Leigg
        24
    Leigg  
       2020-11-17 17:15:34 +08:00 via iPhone
    你想加班吗?
    zzzzzzggggggg
        25
    zzzzzzggggggg  
       2020-11-17 17:29:38 +08:00
    闲的。。。
    aincvy
        26
    aincvy  
       2020-11-17 17:43:01 +08:00
    方案一: go 调用 python 代码。
    参考项目: https://github.com/sbinet/go-python

    方案二:python 调用 go 的模块
    参考阅读: https://cloud.tencent.com/developer/article/1568553
    http://chingchuan-chen.github.io/posts/201804/2018-04-16-python-call-go.html

    方案三:c/c++ 调用 go && python
    1. 把 go 项目编译成动态链接库。
    2. c/c++ 调用上一步生成的动态链接库, 外加调用 python 的库,建立 python 的脚本环境。
    3. 可能还需要做一个桥 链接两个项目的接口。
    zzlettle
        27
    zzlettle  
    OP
       2020-11-17 20:06:17 +08:00
    是不是 rpc 比较适合简单的整合。
    感觉可能适合我。
    Hanggi
        28
    Hanggi  
       2020-11-17 20:13:43 +08:00   1
    Go 写业务怎么蛋疼了?如果无法用 Go 写业务建议去掉 Go,因为你不需要它。

    不要为了用 Go 而用,用了 Go 基本就不太需要其他语言了,
    你去看看几个排名靠前的 Go 开源项目,基本都是纯 Go,
    感觉你的思路没有理清楚,要么纯 Python,要么纯 Go 。

    如果有个别库只有 Python 有,我会开一个 Python 的微服务,用 gprc 调用它。
    lasuar
        29
    lasuar  
       2020-11-18 09:58:42 +08:00
    项目中,go 一般和 C/CPP 结合,没见过和 py 结合的
    zzlettle
        30
    zzlettle  
    OP
       2020-11-18 14:13:26 +08:00
    @Hanggi 好吧,我试试看用纯 GO 来写
    我发现我用 GO 写的项目,基本写的我头昏脑胀,出问题,或者根本不知道问题到底在哪里
    用 python 写的,我都很轻松,很少出问题
    sunshinev
        31
    sunshinev  
       2020-11-27 17:59:33 +08:00
    请关注下 chat.osinger.com 最近写的,在 v2 上也好多朋友去看过
    sunshinev
        32
    sunshinev  
       2020-11-27 17:59:58 +08:00
    @sunshinev 前端 Vue+canvas+websocket+protobuf,后端 Golang+websocket+protobuf+goroutine
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     924 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 29ms UTC 20:08 PVG 04:08 LAX 12:08 JFK 15:08
    Do have faith in what you're doing.
    ubao msn 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