回答
是的,你可以用Concurrent ML的消息傳遞很好地完成它。不要被系統時代推遲; John Reppy的book和論文是該主題的優秀指南。美麗的東西!
所有我見過SML生產者 - 消費者的實現都被迫依靠ref
S(爲了保持「睡眠」的項目隊列),所以我傾向於說「不」。
擁有多個線程必然需要不純(非功能性)操作。純函數式編程將您的應用程序視爲功能評估。同時評估兩個東西並在它們之間傳遞數據的概念在此框架中沒有意義。
儘管可以並行地評估一個函數的多個部分,就像在Haskell的``par運算符中一樣,這與生產者 - 消費者問題不同,因此我認爲你不能解決它以功能的方式。
有很多方法可以解決這個問題;每個都有不同的缺點。
例如,「put」可能每次都產生一個新的線程。這樣,你根本不需要緩衝區。如果有很多請求進來,你會產生大量的線程,直到你的CPU比在實際執行它們時更忙線程切換。但是,這只是將問題從代碼移入操作系統:在某個時刻,您總是必須同步訪問內存中的變量。操作系統必須維護一個線程列表,並且訪問這個列表必須同步。
要麼限制線程的數量(然後「put」必須能夠讀取變量,同時線程可能會同時終止並減少它 - >同步訪問)。或者你可能會因爲線程太多而冒充資源。
當「put」被調用並且消費者可以收聽消息時,您可以發佈消息。但這只是實現線程「等待」的一種複雜方式。而且你需要一種方法來確保只有一個消費者獲得這個信息。同樣,你需要一些同步的數據結構。
因此,最終,它不是真正的賦值,這是問題,而是併發訪問單個變量,無論您如何嘗試,對於產品使用者的任何實現,您都必須能夠執行此操作(或整體將單線程)。
是的。檢查功能反應式編程(FRP),這與Concurrent ML(Norman的建議)有關,但功能完全正常。 FRP的語義高度「同時」,同時具有簡單,精確,確定性,功能性的語義模型(時間函數)。
編輯:我引用了「併發」在這裏,因爲我不意味着一貫的經營(面向實現的)併發的概念,這是必要和不確定性,從而阻礙了實用&可靠正確的推理。
- 1. Java生產者 - 消費者:生產者不「通知()」消費者
- 2. 在仿製生產者/消費者中使用任務
- 3. LinkedBlockingQueue - 生產者/消費者
- 4. POSIX生產者 - 消費者
- 5. 生產者 - 消費者使用資源
- 6. C生產者 - 消費者使用PThreads
- 7. 生產者 - 消費者使用同步
- 8. 消費者生產者多線程消費者不會消逝
- 9. 如何在使用Semphores的生產者 - 消費者中消費?
- 10. 多生產者單消費者延遲任務執行
- 11. 消費者/生產者任務的解決方案
- 12. 消費者過濾的生產者 - 消費者阻塞隊列
- 13. 生產者/消費者線程中的油門消費者
- 14. 使用TCP客戶機/服務器的生產者/消費者
- 15. 使用生產者消費者的卡夫卡和微服務
- 16. 同步生產者,消費者和生產者隊列
- 17. 生產者消費終止
- 18. 如何使用信號量解決消費者/生產者任務
- 19. 生產者消費者在Java中
- 20. pthreads生產者 - 消費者問題
- 21. 解決生產者消費者
- 22. Java生產者,蟒蛇消費者,ActiveMQ
- 23. MPI - 生產者和消費者
- 24. 消費者生產者線程問題
- 25. 生產者/消費者 - I/O磁盤
- 26. 僵局生產者消費者
- 27. Java生產者消費者線程
- 28. Grails中的生產者/消費者?
- 29. java線程:生產者 - 消費者
- 30. .NET生產者 - 消費者問題
我沒有在問題中看到多個線程的概念。請注意,純粹功能抽象的*實現*可以使用併發性。併發本身不需要顯示語義/用戶模型。另外,* lazy *函數式編程非常像併發。許多暫停計算(thunk)正在等待其他計算的需求(減少到弱頭正常形式),在這一點上它們暫時活躍起來。儘管所有這些實現都是「併發」(協同式),但語義是純粹而簡單的,因此允許輕鬆,正確的推理。 – Conal 2009-08-06 17:27:30