縮放Ruby腳本我想增加一個腳本,不淨I/O(刮刀)的吞吐量。我不想在ruby中使用多線程(我使用默認的1.9.1解釋器),而是想要啓動多個進程。那麼,是否有一個系統可以做到這一點,我可以跟蹤何時完成重新啓動,以便隨時都可以運行X號碼。也有一些將運行不同的命令參數。我正在考慮編寫一個bash腳本,但是如果在linux上已經存在一個這樣的方法,這聽起來像是一個不好的想法。通過啓動多個進程,而不是使用線程
2
A
回答
1
您可以嘗試叉http://ruby-doc.org/core/classes/Process.html#M003148
你可以得到回報的PID,看看這個過程又或無法運行。
如果你想管理的IO併發。我建議你使用EventMachine。
0
您可以
- 實現(或找到一個相當於創業板),一個線程池(ProcessPool,你的情況),或
- 準備所有的陣列,我們假設1000個待處理任務,拆分比如說10個100個任務(10個是你想要啓動的並行進程的數量),並啓動10個進程,其中每個進程立即接收100個任務進行處理。這樣,您不需要啓動1000個進程並控制其中不超過10個進程同時工作。
2
我建議不要分叉,而應該使用EventMachine(如果您使用HTTP,則使用優秀的em-http-request)。管理多個進程可能有點少,甚至比處理多個線程更多,但相比之下,走向平坦的路徑要簡單得多。由於你主要想做網絡IO,主要是等待,所以我認爲一個平衡的方法可以擴展,或者比分叉或線程更好。最重要的是:它將需要更少的代碼,並且它會更具可讀性。
即使您決定爲每個任務運行單獨的進程,EventMachine也可以幫助您編寫管理子進程的代碼,例如使用EventMachine.popen
。
最後,如果您想在沒有EventMachine的情況下執行此操作,請閱讀文檔IO.popen,Open3.popen和Open4.popen。所有的功能或多或少都是相同的,但可以讓您訪問子流程的stdin,stdout,stderr(Open3,Open4)和pid(Open4)。
相關問題
- 1. 多線程:啓動一個線程,而另一個進程不斷去
- 2. Python多進程而不是線程?
- 3. 使用python啓動多個線程?
- 4. 即使使用線程,啓動進程會掛起主進程
- 5. 關閉通過線程啓動的進程
- 6. 使用啓動過程啓動LogParser進程,遇到的錯誤
- 7. 通過多線程
- 8. 通過路徑,而不是名稱與多個用戶檢索PID的進程
- 9. 線程還是多進程?
- 10. 通過Ansible啓動Docker守護進程
- 11. 通過Bash重新啓動進程
- 12. 取消通過System.Diagnostics.Process.Start()啓動的進程
- 13. Qt多線程啓動線程錯誤
- 14. 使用多線程是不好的做法嗎? (通過SwingWorkers)
- 15. 通過Mule中的守護進程線程維護多個HttpRequests
- 16. 何時通過Java中的線程選擇多個進程?
- 17. 用Windows啓動過程啓動一個進程(找不到支持文件)
- 18. 守護進程線程是否也是守護進程線程啓動的線程?
- 19. 通過一個進程進行多次通信而不破壞管道?
- 20. 可以從一個線程使用System.Threading.Timer啓動多少個線程(定時器)?
- 21. 如何獲取通過execvp啓動的進程的進程ID()
- 22. 從應用程序啓動而不是活動啓動服務
- 23. 多線程啓動安排
- 24. 多線程啓動順序
- 25. 通過Python子進程啓動的Minecraft不起作用
- 26. 如何重新啓動線程而不使用Thread.stop()?
- 27. 通知恢復應用程序,而不是重新啓動
- 28. 如何通過C#啓動/停止/查詢iis應用程序(不是網站,而不是應用程序池)?
- 29. 如何殺死使用R時通過system()啓動的進程?
- 30. 通過Javascript啓動進程[使用Rhino JS]