iT邦幫忙

2017 iT 邦幫忙鐵人賽
DAY 14
0
自我挑戰組

Julia語言—從入門到專案系列 第 14

[Day 14] Reactive programming--實作bridge

我們前面已經提到Task的使用方法跟把Task跟Task之間串起來的方法。

但是總覺得前面的串接方法非常的不自由,於是我想了個方法...

先把初始化搞定

覺得每次初始化Task的時候都要用@task然後要加上一次的consume(),這樣很惱人。
乾脆.....

function init_task(f::Function, args::Vararg)
    x = @task f(args...)
    consume(x)
    return x
end

將函數化為Task只要將function跟參數當成參數傳入,他就可以回你一個初始化完成的Task了。

實作高階函數--map

function map(f::Function)
    x = produce()
    while true
        y = f(x)
        println(x, " -> ", y)
        x = produce(y)
    end
end

這邊我重新定義了map這個函數,然後他可以接受一個function作為參數。
接著我會期待他會把我後面丟給他的x放進f計算之後回給我。
我們試試看吧!

task = init_task(map, x -> x + 5)
a = consume(task, 1)

會印出

1 -> 6

然後我們得到的a6
如此一來就把基本要件實作完成了。

怎麼串接呢

之前的串接方式是要完成尾巴的初始化之後把他串到頭的後面。
就像

init task1
task1
init task2
task2 -> task1
.....

這樣需要從尾巴開始串起的方式很不自由,我把他改成這樣!

init task1
init task2
init bridge_task
 bridge_task
 ↓↑       ↓↑
task2    task1

如此一來我就可以藉由bridge不同的task來提高自由度了。
那要怎麼實作bridge呢?

function bridge(f::Task, g::Task)
    x = produce()
    while true
        y = consume(f, x)
        z = consume(g, y)
        x = produce(z)
    end
end

他就像在兩個task之間搭起一座橋,當然,橋上也可以再搭別的橋!

範例

task1 = init_task(map, x -> x + 5)
task2 = init_task(map, x -> x * 2)
task3 = init_task(bridge, task1, task2)
a = consume(task3, 2)

以上的程式會幫我做(x + 5)*2的運算囉~~~~~


上一篇
[Day 12] Asynchronous programming--連結起來
下一篇
[Day 15] Reactive programming--組合起來!
系列文
Julia語言—從入門到專案31

尚未有邦友留言

立即登入留言