• 顶一个,有意思的问题。把你的代码放出来?

  • Rails 配置的问题,请指教 at 2018年07月02日
  • Rails 的 ENV 到底在 哪儿 at 2018年06月29日
  • [长沙] 诚聘 Ruby 精英! at 2018年06月13日

    是公务员?

  • 你是对的,感谢大神提醒。

    我这边表情包也显示不出来。挺好奇原因的

  • 在 COW 背景下,不就是共享同一块数据的么?如果各自有修改数据的行为,才会触发 copy,来避免相互影响。

    我更新了一下,加上了 COW 的背景。

  • 求详解?

  • 浅谈尾递归 at 2018年06月05日

    递归调用出现在函数末尾,而且该调用的返回值就是当前函数的返回值。

    这时候,执行递归调用的堆栈空间不依赖递归调用之前的堆栈数据(上下文),因为在调用回归的时候,没有和之前的上下文有交互。所以在代码编译执行的时候,就可以只关注当前调用的堆栈数据,不用维护每一次递归调用的堆栈数据。不管函数递归多少次,需要维护的堆栈信息的数量就等于单次调用的数量,是一个常数,不会因为调用次数增加而翻倍。

    这样就可以在一个有限的堆栈空间中,执行该递归函数,不会栈溢出。我暂时的理解是这样的。

  • 数据结构之 HashMap at 2018年06月03日

    谢谢,一起交流才能真正暴露自己的知识盲点,也能在交流中相互学习提高。由于你的评论,我调整了文章一些不合适的说法,在此表示感谢。

  • 数据结构之 HashMap at 2018年06月03日

    目前水平有限,GIL 源码分析还来不起,有兴趣可以参考这篇文章

    GIL 不意味着 线程安全

    这句话是无比正确的,应该不会有人说 GIL 会保证自己写的 ruby 代码是线程安全的。

    但是 GIL 可以保证基于C代码的Ruby原生方法是原子性执行的,检查和释放 GIL 都是在 C 方法的执行前和执行后进行的。

    文中讨论线程安全是针对哈希的操作而言的,hash 的赋值等操作,是由 Ruby 的原生方法实现的。

    所有的讨论并不针对自己写的 Ruby 代码。

    所有讨论基于 MRI,不涉及 Jruby,以及 Rubinius。

  • 数据结构之 HashMap at 2018年06月03日

    连并发都没有,哪儿扯得到并行那里去。Ruby 中只有多线程 IO 操作时能实现并发,在等待 IO 的时候 GIL 会释放,这些线程可以穿插执行。回到 hash 操作,并不能实现多个线程对同一个哈希进行并发操作,因为代码是一条一条执行的。

    有多个 Thread 同时执行,如果你要认为这是并发的话,也行的,没有问题,它们确实在状态上可以认为是并发。不过这些本质上先后执行的线程并不会造成并发问题

    我文中想表达的是真正的并发,所以在理解上可能会有分歧。我调整了一下说法。

  • 数据结构之 HashMap at 2018年06月03日

    Ruby 中有 GIL,也叫全局解释锁。它会保证同一时刻只有一段代码被解释执行。当有多个线程同时对某个 hash 进行写操作的时候,本质上,这些线程是一个个排队先后执行的,所以并不会造成并发竞争问题。

    在 Ruby 中some_hash[some_key] = some_value这种哈希操作虽然有多个步骤(取哈希值=>做映射=>再赋值),但整个操作在底层是由 C 语言实现的,而 GIL 会保证这段 C 代码执行的原子性。这里面并没有真正的并发。

    上面所说的点,和有关 GIL 的知识,建议详细吃透 https://www.jstorimer.com/blogs/workingwithcode/8085491-nobody-understands-the-gil 这篇文章。

  • 最近使用 ps -o rss= -p #{Process.pid} 来检测代码内存消耗,但一直输出是 0, GC.disable 也是一样。搜索到这里,我把楼主的代码 copy 了一份,执行后,内存消耗依然输出是 0。

    wwjdeMac-Pro-3:$ ruby parse1.rb
    Sum: 499999500000
    Time: 14.17
    Memory: 0.0 MB
    

    我的系统及 ruby 信息是:

    wwjdeMac-Pro-3:$ ruby -v
    ruby 2.3.6p384 (2017-12-14 revision 61254) [x86_64-darwin16]
    
    wwjdeMac-Pro-3:$ sw_vers
    ProductName:    Mac OS X
    ProductVersion: 10.12.6
    BuildVersion:   16G29
    

    大神们,请问这是什么情况?

  • 五问 Sidekiq at 2018年05月29日

    感谢提出这么值得思考的问题

  • 五问 Sidekiq at 2018年05月25日

    确实,没太注意到

  • 五问 Sidekiq at 2018年05月25日

    好建议,已加上链接。

  • 五问 Sidekiq at 2018年05月25日

    有些时候,你的选择是很正确的,垃圾文章确实有点多。面对低质量信息源,一般有两种应对模式:

    • “悲观锁”模式,相信都是垃圾,直接全部屏蔽。
    • “乐观锁”模式,相信还是有优质内容,自己去过滤出好的东西

    有一天也许可以通过 AI,帮我们判断,在搜索不同的话题的时候,恰当地在这两种模式间切换。

  • ”写进public 里头的对应目录文件里,下次访问这个路由 Nginx 会直接访问这个文件,应用服务器将不参与任何处理。“

    这句话看的我这个新手好慌,Nginx 是怎么知道这一切的?是怎么知道“下次直接访问”的?我好焦虑。

    page cache 功能的实现需要 nginx 配合,在 nginx 的配置文件中增加路由匹配。示例如下:https://gist.github.com/YanhaoYang/5641abe7ab5630a9cebb

    实际上 nginx 每次都会通过 try_files 直接访问这个文件,只是当发现没有这个文件时,会将请求转发给 Rails,如果这个文件存在,则会直接返回,Rails 就不会参与本次请求。

    焦虑一下子释放了。

  • 可能是内存碎片导致,这篇文章讨论了类似的问题,并有相应的解决方案 https://www.speedshop.co/2017/12/04/malloc-doubles-ruby-memory.html

  • 能详细一点就更好了

  • 对对对,帖子就是想请教这种“灰色”的状况。

  • varnish 这种算是服务器缓存吧,服务器缓存在我们自己的控制范围内。帖子没有讨论这种状况。

  • 谢谢你的回答。明白你的意思,POST 和 GET 只是 header 里面的方法名不一样,要搞的话肯定都可以,没有差别。只是想请教在“正常情况”(没有被乱搞)下的状况。我更新下帖子的说法,之前的措辞不够准确。

    你的观点应该是确认 HTTP GET 请求可能会被运营商缓存的,但具体缓存机制不得而知。

  • 你对我帖子中的说法怎么看?

  • 请教两个问题:

    1 nginx 或者 db 用 docker 来跑的意义是怎么样的?

    2 nginx 放在容器中时,如果要重新构建 nginx 容器,怎么实现服务不中断?

  • 我有个同学在学 ruby,要初学者吗。