顶一个,有意思的问题。把你的代码放出来?
是公务员?
你是对的,感谢大神提醒。
我这边表情包也显示不出来。挺好奇原因的
在 COW 背景下,不就是共享同一块数据的么?如果各自有修改数据的行为,才会触发 copy,来避免相互影响。
我更新了一下,加上了 COW 的背景。
求详解?
递归调用出现在函数末尾,而且该调用的返回值就是当前函数的返回值。
这时候,执行递归调用
的堆栈空间不依赖递归调用之前的堆栈数据(上下文),因为在调用回归
的时候,没有和之前的上下文有交互。所以在代码编译执行的时候,就可以只关注当前调用的堆栈数据,不用维护每一次递归调用的堆栈数据。不管函数递归多少次,需要维护的堆栈信息的数量就等于单次调用的数量,是一个常数,不会因为调用次数增加而翻倍。
这样就可以在一个有限的堆栈空间中,执行该递归函数,不会栈溢出。我暂时的理解是这样的。
谢谢,一起交流才能真正暴露自己的知识盲点,也能在交流中相互学习提高。由于你的评论,我调整了文章一些不合适的说法,在此表示感谢。
目前水平有限,GIL 源码分析还来不起,有兴趣可以参考这篇文章
GIL 不意味着 线程安全
这句话是无比正确的,应该不会有人说 GIL 会保证自己写的 ruby 代码是线程安全的。
但是 GIL 可以保证基于C代码的Ruby原生方法
是原子性执行的,检查和释放 GIL 都是在 C 方法的执行前和执行后进行的。
文中讨论的线程安全
是针对哈希的操作而言的,hash 的赋值等操作,是由 Ruby 的原生方法实现的。
所有的讨论并不针对自己写的 Ruby 代码。
所有讨论基于 MRI,不涉及 Jruby,以及 Rubinius。
连并发都没有,哪儿扯得到并行那里去。Ruby 中只有多线程 IO 操作时能实现并发,在等待 IO 的时候 GIL 会释放,这些线程可以穿插执行
。回到 hash 操作,并不能实现多个线程对同一个哈希进行并发操作,因为代码是一条一条执行的。
有多个 Thread 同时执行,如果你要认为这是并发的话,也行的,没有问题,它们确实在状态上可以认为是并发。不过这些本质上先后执行的线程并不会造成并发问题
。
我文中想表达的是真正的并发
,所以在理解上可能会有分歧。我调整了一下说法。
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
大神们,请问这是什么情况?
感谢提出这么值得思考的问题
确实,没太注意到
好建议,已加上链接。
有些时候,你的选择是很正确的,垃圾文章确实有点多。面对低质量信息源,一般有两种应对模式:
有一天也许可以通过 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,要初学者吗。