• #1 楼 @embbnux 手快了....

  • #5 楼 @vincent ^_^

    #6 楼 @pathbox 相对于多进程而言,是的,但是,相对于多线程而言,这个需要分场景了 大部分时候应该是多线程优势比较大,暂时是这么觉得的

    但是,没办法确定EventMachine and Fiber的解决方案比多线程慢的原因是 fiber 导致的还是 eventmachine 导致的,毕竟在 fiber 的方案中,socket 是由 eventmachine 管理的

    有时间,我再写一点详细的 benchmark,确定下到底是不是 Em 导致的性能降低

  • #3 楼 @watraludru

    1. 可能是,我去改改,避免大家误解
    2. require 'fiber' 确实会改进当前的线程代码的运行模式,也可能是在后面第一个 fiberresume 的时候做,他会在当前线程上初始化一个 root fiber,这个时候,这个线程之后的代码都可以理解是运行在这个 root fiber 上了,因为这个 root fiber 还有一定的特殊性,所以单独提出来将,希望不要和普通的 fiber 的理解混在一起,具体的话就会深入非常具体的 fiber 的运行机制,展开讲我也吃不消了,^_^,具体可以见这个代码:
    if (th->fiber) {
    GetFiberPtr(th->fiber, fib);
    cont_save_thread(&fib->cont, th);
    }
    else {
    /* create current fiber */
    fib = root_fiber_alloc(th);
    th->root_fiber = th->fiber = fib->cont.self;
    }
    

    这是它 fiber store 里面的实现,那么,确实,root fiber 是在第一个 fiber resume 的时候创建的

    static rb_fiber_t *
    root_fiber_alloc(rb_thread_t *th)
    {
        rb_fiber_t *fib;
        /* no need to allocate vm stack */
        fib = fiber_t_alloc(fiber_alloc(rb_cFiber));
        fib->cont.type = ROOT_FIBER_CONTEXT;
    #if FIBER_USE_NATIVE
    #ifdef _WIN32
        fib->fib_handle = ConvertThreadToFiber(0);
    #endif
    #endif
        fib->status = RUNNING;
        fib->prev_fiber = fib->next_fiber = fib;
    
        return fib;
    }
    

    在 windows 上会有非常明显的 ConvertThreadToFiber 的调用,因次,我才说会进入一个主 fiber 的模式

    3.我试过,兼容性不太好.....

  • #1 楼 @watraludru 感谢您的指出,不过这几点我的理解和您不太一致:

    1. 这里的并行是指逻辑上的并行,并不是指所有代码上在物理上的同一个时间上运行
    2. require 'fiber'是必须的,进入 irb 状态之后,可以访问到 Fiber 的库,但是 Fiber 的整个运行时态其实是未初始化的,你没办法访问到Fiber.current的方法,当require 'fiber'了之后,它做了以下事情: ```c

    void ruby_Init_Fiber_as_Coroutine(void);

    void Init_fiber(void) { ruby_Init_Fiber_as_Coroutine(); }

    
    见ruby-2.1.0源代码下`ext/fiber/fiber.c `
    
    ruby_Init_Fiber_as_Coroutine具体是这么实现的:
    ```c
    void
    ruby_Init_Fiber_as_Coroutine(void)
    {
        rb_define_method(rb_cFiber, "transfer", rb_fiber_m_transfer, -1);
        rb_define_method(rb_cFiber, "alive?", rb_fiber_alive_p, 0);
        rb_define_singleton_method(rb_cFiber, "current", rb_fiber_s_current, 0);
    }
    

    见 ruby-2.1.0 源代码下 cont.c 代码的 1686 行

    主 Fiber 这个概念是有的,ruby 中的在某个线程中,如果 require 了 fiber,那么当你在调用其它 fiber 的 resume 方法的时候,当前的线程模式就会转换成 fiber 模式,当前线程的代码堆栈就会成为你当前线程的 root_fiber

    VALUE
    rb_fiber_current(void)
    {
        rb_thread_t *th = GET_THREAD();
        if (th->fiber == 0) { // 就是这行
        /* save root */
        rb_fiber_t *fib = root_fiber_alloc(th);
        th->root_fiber = th->fiber = fib->cont.self;
        }
        return th->fiber;
    }
    

    见 ruby-2.1.0 源代码下 cont.c 代码的 1333 行

    第三个问题: em-synchrony 我通读过所有的代码,但是 fiber 问题不在于 em-synchrony 下简单的实现,而是在于需要定制化你所需求的库的读写,一味将 socket 直接指向 em-synchrony 下的 socket 实现不是一个兼容性非常好的问题

  • 报个名,准备去

  • #5 楼 @vincenting 我们线上一直在用这个,但是这个图片不能太大,图片太大转换会出错

  • 如果图片不大的话,nginx 有原生的库直接支持图片的 resize....

  • 报个名,回来自己打车么?

  • #11 楼 @lyfi2003 为什么不尝试放到 redis 里面?

    Resource marshal 之后存到 Redis Role 每个 role 作为一个 reds 的 list, 存储对应 resources 的 ID

  • Ruby 服务器对比 at 2015年05月11日

    passenger 牛逼的功能都是企业版提供的呀..

  • 这个如何解决在判断权限的过程中带来的额外的数据库查询? 一个页面我有 10 个地方需要匹配权限,我需要额外的查询 10 次数据库?

  • 预定一个位置

  • 报个名

  • mark as data

  • 给你们报个 bug,页面宽度不到 1K 像素的时候,你们首页的登陆会从 个性后缀 电子邮箱 马上开始体验 变成

    个性后缀 电子邮箱 马上开始体验

    会影响你们首页的展现

  • 你的 Activity 对象的 target_obj 存的是 { "id" => ObjectID("xxxx"), "type" => "Commmunity" }的数据, 因此, 你在代码中查询的时候, 你传入的 hash 中的 id 字段是 object_id 对象, 但是你直接查询的时候, "id" 就是 string 对象,不匹配的

  • Ruby 之 MongoDB - CRUD at 2013年09月12日

    @neverlandxy_naix mongid 适合做业务性比较强的,不太强的 api 场景用 mongodb 的原生驱动做有更好的性能,毕竟 mongoid 在现在这个版本还没提供连接池的能力,做 api 的话没有连接池,没有 EM,差距还是很大的

  • @huacnlee 应该是的, 它判断是否失败应该是基于 http response code 的

  • @guyanbiao 相对来说,如果在内网环境下,不在本机测试反而更加准确的可以体现性能,毕竟,api 服务器大多数都是通过 tcp 访问的

  • @luikore 嗯,有时间看一下,ab 也可以 post 的吧, postfile...

  • @realwol 随便写,写得好大家收益,写的不好有人指导,稳赚的事情呀

  • @xstmjh 受宠若惊啊!~

  • @robbin 同意这个观点,基于回调的写法真的太反人类了, 再挖掘性能就等日后有兴趣再说了,毕竟现在还没有这么大的性能需求

    不过还是挺有收获的,自己这么摸索几下

    感谢@kenshin54 后面配合做的测试,理解也深刻了许多啊

  • @outman 我也是尝试了解下 nodejs,感觉应该发展的不错,但是不尝试么又不知道,就自己写点代码摸索摸索,对比对比,就出了这次的事情,哈哈

  • @outman 纯粹探索在单进程模型下,同样 EM 的实现,ruby 和 node 有多少差距,以此来推断如果逻辑很素的但是性能要求很高的服务比较适合哪个体系来做

    最初的目的是同样的 api 服务器,基于 rack 的 em 的 ruby 和基于 express 的 node 的差距比较大,所以比较好奇,差距在哪里

    Fiber 作为编程很友好的并发形式,其实我个人还是很喜欢