V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
itskingname
V2EX  ›  问与答

请教大家,在 Python 中,多个 socket 应该如何管理。

  •  
  •   itskingname · 2019-08-14 09:52:20 +08:00 · 1315 次点击
    这是一个创建于 1959 天前的主题,其中的信息可能已经有所发展或是发生改变。

    我现在有一个聊天服务器 A + 40 个小服务器 S1, S2, ..., S40

    小服务器需要和聊天服务器创建 2000 个 Socket 连接。每个 Socket 里面的消息传递时间不同,有一些 Socket 里面持续不停有消息流动,有一些 Socket 里面几十分钟发一条消息。但事先不知道哪个 Socket 的消息多。

    有以下几个方案:

    1. 每个服务器启动 50 个进程。每个进程一个 Socket 长连接。每个进程大概占用 15MB 内存。
    2. 每个服务器启动一个进程,每个进程里面启动 50 个线程,每个线程对应一个 Socket 长连接。
    3. 每个服务器启动一个进程,进程中创建 50 个协程,每个携程绑定一个 Socket,哪一个携程来了消息就处理哪一个,其他的挂起。

    现在我使用的是第一个方案,效率低下。想使用第三个方案。大家有什么忠告提给我吗?

    8 条回复    2019-08-14 12:54:53 +08:00
    lishunan246
        1
    lishunan246  
       2019-08-14 10:15:32 +08:00 via Android
    萌新想问下 Python 进程可以做到只占用 15m 内存吗?
    itskingname
        2
    itskingname  
    OP
       2019-08-14 10:24:27 +08:00
    @lishunan246 可以。
    so1n
        3
    so1n  
       2019-08-14 10:34:38 +08:00
    没弄过这些,不过协程比较好把
    40huo
        4
    40huo  
       2019-08-14 10:47:01 +08:00 via Android
    每个线程里都可以起协程,内存更少
    locoz
        5
    locoz  
       2019-08-14 10:52:06 +08:00
    是 asyncio 不够骚了吗...聊天服务器+2000 个连接,用协程没啥压力啊。
    itskingname
        6
    itskingname  
    OP
       2019-08-14 11:24:46 +08:00
    @locoz 感谢感谢
    misaka19000
        7
    misaka19000  
       2019-08-14 11:27:40 +08:00
    肯定用协程啊
    itskingname
        8
    itskingname  
    OP
       2019-08-14 12:54:53 +08:00
    @misaka19000 我准备用 asyncio 的 Stream
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   5288 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 03:45 · PVG 11:45 · LAX 19:45 · JFK 22:45
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.