簡體   English   中英

如何使Ruby或Python網站使用多個核心?

[英]How to make Ruby or Python web sites to use multiple cores?

盡管PythonRuby每個解釋器線程都有一個內核線程,但它們有一個全局解釋器鎖(GIL),用於保護潛在的共享數據結構,因此這會禁止多處理器執行。 盡管用C或C ++編寫的那些語言中的部分可以是自由線程的,但除非您使用多個進程,否則使用純解釋代碼是不可能的。 實現這一目標的最佳方法是什么? 使用FastCGI 創建群集或虛擬化服務器 使用他們的Java等價物,JRuby和Jython?

我不完全確定你想要解決哪個問題,但如果你通過apache prefork部署你的python / django應用程序MPM使用mod_python apache將啟動幾個工作進程來處理不同的請求。

如果一個請求需要這么多資源,那么您想要使用多個核心就可以看一下pyprocessing 但我不認為這是明智的。

使用rails執行此操作的“標准”方法是運行Mongrel實例的“包”(即:rails應用程序的4個副本),然后使用apache或nginx或其他一些軟件坐在它們前面並執行操作作為負載均衡器。

這可能與其他ruby框架如merb等有關,但我沒有親自使用過。

操作系統將負責在其自己的CPU上運行每個mongrel。

如果您安裝mod_rails aka phusion passenger,它也會啟動和停止rails進程的多個副本,因此最終會以類似的方式將負載分散到多個CPU /核心。

在Python和Ruby中,只能使用多個核心,就是產生新的(重量級)進程。 Java對應物繼承了Java平台的可能性。 你可以暗示使用Java線程。 這就是為什么有時(通常)像Glassfish這樣的Java Application Server被用於Ruby on Rails應用程序的原因。

使用在單獨的解釋器中運行每個響應的接口,例如Python的mod_wsgi 這樣可以在不遇到GIL的情況下使用多線程。

編輯:顯然, mod_wsgi不再支持每個進程多個解釋器,因為白痴無法弄清楚如何正確實現擴展模塊。 它仍然支持在單獨的進程FastCGI樣式中運行請求,因此這顯然是當前接受的解決方案。

對於Python, PyProcessing項目允許您使用與使用線程類似的進程進行編程。 它作為multiprocessing包含在最近發布的2.6版本的標准庫中。 該模塊具有許多功能,用於建立和控制對共享數據結構(隊列,管道等)的訪問,並支持常見習語(即管理者和工作者池)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM