假設我必須從其中有很多大型XML文件的目錄中讀取數據,我必須解析並通過網絡將它們發送給某個服務,然後再將響應寫入磁盤。您如何規範Erlang中的併發/相關進程性能?
如果是Java或C++等,我可以做這樣的事(希望這是有道理的):
(File read & xml parsing process) -> bounded-queue -> (sender process) -> service
service -> bounded-queue -> (process to parse result and write to disk)
然後我的線程分配給每個進程的任何適當的數目。這樣我就可以將每個進程的併發性限制在最佳值,並且有界的隊列將確保不會出現內存不足等問題。
雖然在Erlang編碼時應該怎麼做?我想我可以在一個函數中實現整個流程,然後迭代目錄並儘可能快地產生這些「開始 - 結束」進程。這聽起來並不理想,因爲如果解析XML需要比讀取文件等應用程序更長的時間。可能會因內存中的許多XML文檔等而導致內存不足,並且無法將併發性保持在最佳級別。例如。如果「服務」在併發性爲4時最有效,那麼通過巨大的併發性來實現它將是非常低效的。
erlang程序員應該如何處理這種情況?即什麼是固定線程池和有界隊列的erlang替代品?
感謝您的回答!如果我關心的不是記憶,例如如果我想與特定併發的服務交談,那麼使用進程池是否好? *編輯*:我想我從DefLog得到了答案 – 2011-06-07 23:54:03
他基本上得出了和我一樣的結論。而且基於固定數量的進程進行限制並沒有真正的意義,實際上並沒有告訴你什麼(除非這是你的確切要求:同時不超過N個併發任務)。 – 2011-06-08 08:49:50