我認爲使用ets仍然會引入類似的副作用。在進程字典ETS的在Erlang中,在流程中使用ets而不是流程字典有什麼好處?
回答
由於ETS存儲在erlang進程以外的堆中,因此不會進行垃圾回收。這意味着,當你把東西放入ets中時,它會被複制到它中,當你把它拿出來時,你會在你的過程中得到一份副本。大量的ets查詢可能會導致您的流程過度考慮(但這隻與非常高的吞吐量有關)。
進程字典是垃圾回收。它存儲在進程自己的堆中。所以當你查看它時,你會得到一個與你輸入的完全相同的值的參考。存儲在流程字典中的值不會被壓縮。
這兩種方法都是非純的,即它們有副作用。是的,這是不好的,是的,這不是我們有兩種選擇的原因。
好處是:
- 其他進程可以訪問ETS表直接
- ETS給你搜索/匹配/重複設施,而進程字典只是一個key-value存儲。
- 您可以在一個步驟中將表格保存/加載到文件中
- 如果您的所有者進程死亡,則表可以由其他人繼承,這樣數據就不會丟失。
ETS或多或少表現得好像表格在單獨的進程中一樣,並且請求是發送到該進程的消息。雖然它沒有與ETS的屬性建模的過程一起實現。實際上可以通過流程來實施ETS。
這意味着副作用屬性與其餘的Erlang一致。
進程字典就像Erlang中的其他東西一樣,並且添加它是一個很大的錯誤。沒有理由使用進程字典而不是像dict或gb_trees這樣的進程本地字典之一。
我猜ETS和「基於過程的ETS」之間的區別在於前者可以在使用精細鎖時真正併發地訪問,而後者將始終強制同步(又名序列化)。 – Zed 2009-09-27 20:14:00
由於訪問ETS的過程並非同步,所以「調用」過程必須等待,直到它從ETS獲得「回覆」。不同之處在於,流程字典將始終在該流程的上下文中,而ETS將是對共享數據的同步訪問。 – rvirding 2009-10-01 13:20:37
我知道rvirding已經評論過,他是Erlang的大師之一,但在這一點上,我虛心不同。 我確實看到需要(並已經使用)流程字典的內部管理功能。 有時我們需要在一個進程內存儲一個不屬於進程主函數一部分的函數的狀態,例如記錄器可以維護狀態,並且將記錄器狀態放入主應用程序邏輯是不好的。 – 2016-06-23 18:39:06
毫無疑問,ETS具有更多的功能並且更加複雜。但是......
隨着進程字典更新/查找操作只移動引用,而不是整個數據(見基督徒準確的答案),它可以更快,尤其是對大數據結構。一旦我重構了一部分代碼以保持proc中的大型和頻繁訪問的數據結構。而不是ETS,我們在這部分代碼中的速度提高了30%。
在很多情況下,數據只能由一個進程訪問。在這種情況下,我認爲proc.dict和ETS之間沒有太大的理論差異。兩者都用於保持記憶中的副作用。 此外,您可以訪問另一個進程的proc.dict,如
process_info(whereis(net_kernel),dictionary)。
- 1. 在iOS編程中使用Storyboard而不是xib文件有什麼好處?
- 2. Erlang中的流程平衡
- 3. 在@ font-face中使用SVG字體而不是TTF/EOT有什麼好處?
- 4. 在Laravel使用流浪者有什麼好處?
- 5. Erlang:在ETS中存儲PID
- 6. Erlang工作流程
- 7. 在Python子流程中,使用Popen()和check_output()有什麼區別?
- 8. 在Rails應用程序中使用葡萄有什麼好處?
- 9. 爲什麼ets表能夠在ct:init_per_testcase而不是init_per_suite中存活?
- 10. 在子流程中使用字符串
- 11. 什麼是使用TextMate項目文件的好工作流程?
- 12. 什麼是Erlang的流操作方法?
- 13. 在流水線函數中包含「return」關鍵字的好處是什麼?
- 14. 使用Doctrine使用DQL而不是SQL有什麼好處?
- 15. const關鍵字在編程中的好處是什麼?
- 16. 從新流程中調用現有流程,然後繼續使用新流程
- 17. 爲什麼在使用jmf流時,它是UDP,而不是Wireshark中的RTP?
- 18. Facebook應用程序流程中用於signed_request的oauth_token是什麼?
- 19. StyleSheet.create「不在流程中」
- 20. 在Python中,在多線程程序中調用os.waitpid有什麼好處?
- 21. 協程有什麼好處?
- 22. 什麼是MVC程序流程?
- 23. 什麼是最流行的編譯器,MSVS有什麼不好?
- 24. 如何在Spark流應用程序中處理DynamoDB流
- 25. 爲什麼流星在1.3教程中使用導入
- 26. 使用calloc()而不是malloc()和memset()有什麼好處嗎?
- 27. 使用分部類而不是抽象類有什麼好處?
- 28. 使用Flux而不是for循環,有什麼好處?
- 29. 使用名稱而不是版本號有什麼好處?
- 30. 使用ORDBMS代替RDBMS有什麼好處,而不是JPA
幾乎所有的Erlang書上說,我們應該從工藝庫遠離,但我認爲使用ETS是沒有太大的不同。 – 2009-09-27 14:11:43
「幾乎所有的Erlang書籍」......這是否意味着三分之二? =) – Zed 2009-09-27 15:01:58