天天看點

Future Pattern

看到msdn的這篇文章【http://msdn.microsoft.com/zh-cn/library/dd764564.aspx#y300】好像是今年2月份,快過年的樣子。記得hm還特蛋疼的研究了一下lamada的彙編實作。當時看到visual studio 2010 實作的lamada非常的飄逸,對于future并沒有太在意。貼一段飄逸的代碼:

async_future<int> max_value([&]() -> int {

int largest = int_min;

for_each(values.begin(), values.end(), [&](int value) {

if (value > largest)

{

largest = value;

}

});

return largest;

最近翻看posa4時,又研究了一下future模式,對future有了新的了解。

什麼是future:future的原理是當你申請資源(計算資源或i/o資源)時,立即傳回一個虛拟的資源句柄,當真正使用的時候,再将虛拟的句柄轉化成真正的資源,相當于預擷取。

future使用方法僞代碼如下:

future::future(job_func):

thread.run(job_func);

end

future::get_result():

while(result == null):

thread.sleep()

return result

future模式隻有在并行運算的架構内才有意義。當一個邏輯操作設計的耗時操作比較多時,可以将耗時操作拆分成多個不太耗時的子操作,使子操作并行的執行,邏輯層依次擷取子操作的結果。架設我們要執行一個邏輯操作,要求執行一次mysql查詢,還要讀一次檔案,如果使用普通的同步方式:

do:

query = mysql_query()

file = file_read()

do_thing(query, file)

done

使用future模式示例如下:

do:

future a(mysql_query)//! 非阻塞

future b(file_read) //! 非阻塞

query = a.get_result() //! 阻塞擷取結果

file = b.get_result() //! 阻塞擷取結果

這樣sql查詢和讀取檔案實作了并行運作,同步等待的時間為二者開銷較大的運作時間。

适于使用future模式的時機:在用戶端,我們常常需要阻塞的擷取結果,通過future模式可以大大提高響應速度。而在服務端程式,阻塞操作會降低系統的吞吐量,future模式試用的範圍較窄,一般服務端采用異步回調的方式,将耗時的操作并行化,再通過回調方式将結果合并。future構造時生成了虛拟的結果,如果使用這個結果越晚,當get_result時越不容易阻塞,是以從生成future到擷取結果的間隔越長,future模式的功效越大。

繼續閱讀