code

2017年8月10日 星期四

Parallel Java 2 - Future

Functional Programming

functional programming最大特點就是沒有state,也就是每次f(x) = y 是固定的,不可能有其他mapping (否則就違反 function 在數學上的定義)。

所以一但釐清function calls之間的dependency,則可以找到能夠parallelize的部分。例如以下三個function calls:


C = G(A), D = H(A),所以只要知道A的值,C和D的運算式可以平行的。


Future Model

Future是一個functional parallelism pattern,定義某個async object的functional operations,當建立物件時,不會立即執行task,而是當caller 呼叫 get() ,才會去執行task (可以看成function才真正去把input map成output,所以稱為Future。

例如上面說的 A = F(B) 這個mapping,如果用Future來表現 (以下是pseudocode):

FA = Future { F(B) },這邊宣告建立一個Future instance (也稱為promise),其執行的task為 F(B)。
則當要真的去取得FA的task結果,我們可以 FA.get()。

所以 宣告 FC = Future{ G(FA.get()) },FD = Future { H(FA.get()) }

注意因為Future要再get()被呼叫時才會真正去執行task 並且block and wait,所以它在宣告後可以馬上return,繼續執行下一個statement。如果把第一段三個數學式子化成computation graph:


可以看到一但G(A) H(A)要真正執行task的時候,他們要等待FA這個FUTURE執行完,也F(B)的value必須要得到,所以在graph中是以JOIN來block。


Implement Future model in Java

因為Future task是有return value,所以要extend RecursiveTask。
依樣要override compute(),其他沒什麼不一樣。

真正要create future object還是依樣要call fork(),主要的thread還是要join,這相當於implement Future中的get():


注意這邊的join()是有return value的,因為RecursiveTask有implement Java的Future interface,所以這個join()跟之前的RecursiveAction的join是不一樣的signature。






沒有留言:

張貼留言