看板 Ruby 關於我們 聯絡資訊
※ 引述《lintingy (4/9 熱舞成發在新體! 4/9)》之銘言: : 環境: : Ruby 1.8.7 : Rails 3.0.7 : 狀況: [...] 大哉問 XD : 1. rails default使用single thread的原因是什麼? : 要能夠讓很多使用者同時使用網站但卻用single thread,這不會很矛盾嗎? 這個問題有很多很多的層面,以我個人主觀的說法是,rails 打從一開始就沒寫好, 不是個 thread-safe 的 framework. concurrency 的作法有很多種,threaded 只是 其中一種。另外大致上分成 multi-process (fork) 和 event-driven (evented). 最早 rails 是走 multi-process 的路,不管是用 fast-cgi 或 mongrel. 這種作法的優點是,程式很好寫,因為根本就不用去管 thread-safety, 也就是 可以大量使用有 state 有 side-effect 的暴力寫法。對不太擅長寫程式的人而言, 這也是最簡單的作法。 後來 rails 終於變成 thread-safe 了,但預設還是會做 lock, 我沒記錯的話。 因為大部份的 rails application 仍然不是 thread-safe, 跑 multi-thread 還是 會爛掉。 至於如果你想用 evented-rails 或 threaded-rails, 主要要注意的是 server 本身得支援才行。而這兩種作法,都得保證你自己的程式也是 thread-safe 或 async-safe 等等,有很多技術細節要討論。 : 2. 丟到background去處理,跟想辦法讓rails server變成multithread, : 這兩種方式有哪一種會比較建議嗎? 這兩個解決的問題是不同的。丟到 background 處理,server 得先回應 client. 反之如果是 threaded 或 evented, server 可以等到有結果後才回應 client. 因此問題是,能不能先回應 client? 如果這不是個重要的問題的話,我會建議先走 background (worker), 因為這種作法比較單純簡單,而且以後總是用得到。 不過不管怎麼樣,這兩種作法並不是互斥,能走 threaded 或 evented 還是比較好。 (技術難度也高很多) : 3. 那如果用background執行的方式,要怎麼樣知道他已經處理完了? : (因為處理完後要馬上給使用者feedback) : (而之前有用過fork處理類似問題, : 但是這麼一來就沒有辦法知道他已經處理完了, : 後續的顯示就不知道該怎麼接上...) fork 應該還是能知道他處理完了,不過在這邊用 fork 應該不太對... 總而言之,這邊會變成兩種作法... 也就是常見的 poll 或 push 了。 只是要能動的話,可以先找各種 poll 的方法,效能不佳的話再看 push, 再不行再試 threaded 或 evented, 因為這難度最高,所以最後試... : 4. 最後則是說,如果要實做rails server的multithread, : 有沒有建議的方式? rails 裡有個 config.threadsafe! 要打開,然後 server 本身也要跑 thread, 比方說 Rainbows! 的各種 thread model: http://rainbows.rubyforge.org/ ThreadPool for 1.9: http://rainbows.rubyforge.org/Rainbows/ThreadPool.html ThreadSpawn for 1.8: http://rainbows.rubyforge.org/Rainbows/ThreadSpawn.html 不好意思的是,我自己是沒玩過,之前試 async rails 碰了一堆壁, rails 自己有一些奇怪的 lock, 所以就不想在 rails 上試這些了... 可能 rails 3 有改善吧,不知道 : 抱歉,第一次問問題就問了一大堆,也還希望有人可以協助解答, : 感謝非常!!!!!!!! -- In Lisp, you don't just write your program down toward the language, you also build the language up toward your program. 《Programming Bottom-Up》- Paul Graham 1993 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.229.250
lintingy:感謝版主!! 後來想想也確實 這兩種方試試再解決不同的問 08/03 12:39
lintingy:題 兩種方式其實都應該要嘗試看看才對!! 感謝!! 08/03 12:40