縮放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. 關閉通過線程啓動的進程
- 3. 通過多線程
- 4. 通過Bash重新啓動進程
- 5. 通過Ansible啓動Docker守護進程
- 6. 線程還是多進程?
- 7. 何時通過Java中的線程選擇多個進程?
- 8. 通過Mule中的守護進程線程維護多個HttpRequests
- 9. 用Windows啓動過程啓動一個進程(找不到支持文件)
- 10. 通過一個進程進行多次通信而不破壞管道?
- 11. 守護進程線程是否也是守護進程線程啓動的線程?
- 12. 通過Python子進程啓動的Minecraft不起作用
- 13. 如何重新啓動線程而不使用Thread.stop()?
- 14. 使用Python通過STDIN/STDOUT啓動和控制外部進程
- 15. 獲取通過ssh使用sudo啓動的進程的PID
- 16. 通過Javascript啓動進程[使用Rhino JS]
- 17. 「新線程」不啓動新線程?
- 18. 無法啓動多個線程
- 19. C# - 啓動同一個「永不關閉」的父進程的多個線程子進程
- 20. iPhone應用程序從最後一個已知狀態啓動,而不是從進程開始重新啓動
- 21. 如何在c#中的單個進程中使用線程啓動exe應用程序的多個實例?
- 22. 通過python多處理啓動子進程掛起
- 23. C# - 通過使用線程
- 24. 從多個線程通過Process.Start()啓動一個可執行文件()
- 25. 在Celery中啓動多個進程
- 26. 啓動shell的多個進程
- 27. java多線程 - 子線程不會立即啓動
- 28. acm.graphics庫 - 小程序啓動而不是
- 29. 如何在for循環中多線程啓動進程?
- 30. 使用單個啓動腳本啓動多個進程並保持運行