我們前面已經提到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了。
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
然後我們得到的a
是6
。
如此一來就把基本要件實作完成了。
之前的串接方式是要完成尾巴的初始化之後把他串到頭的後面。
就像
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
的運算囉~~~~~