在Scala中,當你編寫一個沒有副作用並且引用透明的函數時,這是否意味着運行時環境會自動將其處理分配給多個線程?Scala中的併發?
如果是這樣,爲什麼有人工方法在像Actor模型這樣的語言中執行併發?
在Scala中,當你編寫一個沒有副作用並且引用透明的函數時,這是否意味着運行時環境會自動將其處理分配給多個線程?Scala中的併發?
如果是這樣,爲什麼有人工方法在像Actor模型這樣的語言中執行併發?
不,通常情況下並不意味着如此,除非您以某種方式明確指定需要並行處理(例如ScalaCL,並行集合)。這將是很難不可能它自動地完成,例如:
def foo() = {
val x = 1 + 2
val y = 2 + 3
x + y
}
雖然,x和y 的計算可以被並行化,在實踐中這將是更慢(由於並行化引起的罰)比串行碼。因此,對於所有內容的自動並行化,您將最終得到基本單元的非常無效的代碼。
你可以說:你爲什麼不併行代碼自動和選擇性(當它是不值得例如,不要並行),但這樣的系統必須依靠數十億的因素,最重要的將是一個特定的架構,當前的操作系統負載,運行配置文件,等等(我想最終,我們將不得不解決halting problem)。而這個神奇的跟蹤系統將涉及它自己的懲罰。
最後,雖然有effect typing research,股票scala沒有任何方法來區分副作用和非副作用函數。
畢竟,手動並行化scala代碼並不難,就像@fracca展示的那樣。
函數不會自動並行運行,但可以輕鬆地做到這一點。
舉例來說,如果你有一個大的集合,你可以很容易地parallelise致電.PAR
(1 to 100000).par.map(_ * 2)
期貨在運行,演員和其他策略仍然是有價值的。這項工作的最佳工具。
也許,'(1至100000).par.map(_ * 2)'? – maks
這就是我的意思,謝謝! – fracca