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 · 4774 次点击
    这是一个创建于 1462 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近开发一个后端服务器,游戏的
    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   ·   实用小工具   ·   5864 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 35ms · UTC 06:29 · PVG 14:29 · LAX 22:29 · JFK 01:29
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.