2012-01-24 31 views
2

什麼是提供一個易於使用的對象風格的界面到HTTP API,同時還允許異步HTTP請求作出的好辦法?例如,假設下面的代碼:如何創建異步HTTP請求,同時還提供對象接口?

user = User.find(1) # /api/v1/users/1 
f = user.foo # /api/v1/users/1/foo 
b = user.bar # /api/v1/users/1/bar 

調用該foobar方法在邏輯上並行調用,但是如果可能的話,我想,讓主叫用戶有一個乾淨的方式來宣告自己的意圖並行調用而不涉及底層HTTP庫的細節。

我不認爲看不見的自動化並行化是一個好主意,所以調用代碼是明確的關於它的預期。但是,我認爲類似下面的塊語法對於前端開發人員在知道一組請求不相互依賴時能夠使用是非常有用的。

# possible implementation? 
user = User.find(1) 
User.parallel do 
    f = user.foo 
    b = user.bar 
end 

這可能嗎?我如何使用Ruby 1.9.2來完成這個任務?

回答

1

透明並行化是通過一種叫做未來的總體完成。在紅寶石中,懶惰和承諾的寶石都實現了期貨。下面是與承諾寶石爲例:

require 'future' 
user = User.find(1) 
f = future{user.foo} 
b = future{user.bar} 

一個未來將運行在一個塊計算在後臺線程,任何企圖F上操作或b將阻止,除非後臺線程已經完成運行。

作爲圖書館的設計師,只要你的庫是線程安全的,這應該是在許多情況下正常,雖然它可能不紅寶石規模那麼好。

+0

我選擇調查賽璐珞寶石,謝謝! [github上](https://github.com/tarcieri/celluloid) – afex

1

這個工程採用異步SQL的方式是這樣的:

User.where(:id => 1).async_each do |user| 
    Foo.where(:id => user.foo_id).async_each do |foo| 
    # ... Do stuff with foo ... 
    end 
    Bar.where(:id => user.bar_id).async_each do |bar| 
    # ... Do stuff with foo ... 
    end 
end 

這是我與異步的續集,這很像ActiveRecord經驗。

請記住,這是很多疊在一起的回調,所以如果你不小心東西可以得到橫盤整理。