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

io 复用就是一个线程可以监听多个连接,减少无谓的切换,但是在监听到改变之后,依然可能被阻塞住啊?

  •  
  •   petelin · 2016-07-31 17:03:16 +08:00 · 1952 次点击
    这是一个创建于 3072 天前的主题,其中的信息可能已经有所发展或是发生改变。

    比如 100 个客户端,连接到了服务器,然后都停止操作, epoll 好处就是一个进程(线程)就可以 hold 住 100 个连接,而不用创建 100 个进程或线程由操作体统来切换上下文,给每个线程都分一点时间,而是当有客户端传送过来数据的时候,阻塞结束可以进行下一步操作,伪代码:

    for loop 
    	# 阻塞等待 100 个客户端返回一个可读的 socket
        
        # def dosomething
    

    问题是如果在 do something 里进行数据库连接等费时间的 io 操作,响应时间依然感人啊。。。

    比如两个人并发访问,第一个人 do something,花了三秒(io 操作),下一个用户就得等三秒才开始为他服务,,,,

    我的理解是否有错误?解决do something里面 io 时间的又是什么技术?我大概觉得能用 gevent ( io 阻塞的时候 yield 到其他协程),但是想不明白具体是怎么做的,有什么文章或者书吗?谢谢大家。

    9 条回复    2016-08-01 08:33:21 +08:00
    SErHo
        1
    SErHo  
       2016-07-31 17:15:23 +08:00   ❤️ 1
    "进行数据库连接等费时间的 io 操作" 也就是说你在“异步”(姑且叫异步吧,其实是事件循环)里面进行了耗时的同步 IO 操作,这是错误的。。。

    解决方法就是把这个数据库同步 IO 操作改成异步的,加入到你主体的事件循环里面,问题是很麻烦做到,有时候不可能,想想在 tornado 里面做数据操作的时候,这就是为什么有那么多针对 tornado 数据库操作的库,如 https://github.com/PyMySQL/Tornado-MySQL

    所以需要 gevent 或者 golang 这种在框架或语言底层自动将 IO “异步”化(多路复用)的技术。
    petelin
        2
    petelin  
    OP
       2016-07-31 17:29:57 +08:00
    @SErHo 确实是`事件循环`,那就是说我对这种服务器框架的理解还是对的,单个线程就是通过死循环一个一个的处理请求。
    在时间循环里进行异步 io ,,,(⊙o⊙)…我小小的脑子想不出来改怎么调度啊,,,先处理 触发的事件呢,还是先处理 回调的事件呢,他怎么知道回调的函数改执行了,这都是在一个线程里啊
    SErHo
        3
    SErHo  
       2016-07-31 17:52:43 +08:00
    @petelin 所以说做到很麻烦啊,要进行详尽的规划和拆分,你看看 Nginx 的 upstream 相关的模块那代码写的是多蛋疼,回调过去回调过来的,这就是为啥业务复杂了还是用协程(gevent, golang) 这类的爽。
    akira
        4
    akira  
       2016-07-31 18:04:25 +08:00
    理解没问题,所以 dosomething 里面尽量不要有耗时的操作
    oska874
        5
    oska874  
       2016-07-31 18:55:10 +08:00
    dosomething 里再启个线程?
    julyclyde
        6
    julyclyde  
       2016-07-31 23:11:30 +08:00
    socket 可以是 NONBLOCKING 的啊
    为什么你认为必须阻塞?
    shyling
        7
    shyling  
       2016-08-01 01:15:48 +08:00 via iPad
    @SErHo golang 神马时候变成协程了
    IwfWcf
        8
    IwfWcf  
       2016-08-01 02:48:08 +08:00 via iPhone
    协程大法好
    petelin
        9
    petelin  
    OP
       2016-08-01 08:33:21 +08:00 via Android
    @julyclyde 我按 epoll 那个模型说的,但是他阻不阻塞跟你写的 view 函数阻不阻塞没关系。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2691 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 12:34 · PVG 20:34 · LAX 04:34 · JFK 07:34
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.