使用Resque執行後台任務

2021-07-02 04:02:28 字數 1751 閱讀 9555

什麼是後台任務?

預設情況下,程式是按照**從上到下依次執行的,在前面的任務完成之前,下乙個任務是不會開始的。基於這個原理,當使用者提交了乙個比較耗時的請求時,他只能等待任務完成後才能進行下一步工作。在這個過程中,使用者花了時間去做等待的事,這無疑不是好的使用者體驗,所以我們可以把程式優化成這樣:使用者仍然是提交乙個比較耗時的任務,但我們的程式可以立刻響應,同時告訴使用者:「您給我的任務我正在做呢,您先幹點其他的吧,等我做好了再告訴您」。這樣一來使用者的體驗明顯提公升,而resque就是乙個做類似工作的外掛程式。

什麼是resque?

resque是乙個基於redis的後台任務處理外掛程式,而redis是乙個key-value的資料儲存引擎,因為我們在處理後台任務時可能同時會有很多任務要做,而這些任務就儲存在redis中進行「排隊」,決定下乙個該進行哪個任務了。所以在使用resque時,要啟動redis服務才會生效。

安裝/啟動redis

使用resque

我們需要把執行後台任務的**放到乙個名叫perform的方法中,同時為該方法所在的class或module定義乙個例項變數,示例如下

1234567

classuser

@queue = :food

defself.perform(name) puts "your name is#

"end

end

這裡需要注意@queue這個例項變數,它是必不可少並且名字固定。現在我們執行以下命令監聽後台任務

rake resque:work

queue=food

這裡的queue的值和user的@queue的值相同。

啟動console,然後開始呼叫這個方法

resque.enqueue(user, 'ilstar')

這時你會發現在執行rake的終端輸出了內容。到此為止,我們的小實驗已經完成。這個方法的呼叫其實是非同步執行的,讀者可以自己新增一些耗時方法以加強效果。

一些問題

* 這個過程中,你可能會發現你的rake -t中沒有包含resque的相關任務,方法如下

1234

# in lib/tasks/resque.rake

require 'resque/tasks'

task "resque:setup"

=> :environment

* 在執行rake的時候你會被告知需要systemtimer這個gem,新增進去即可。

* perform方法是類方法(這個叫法不準確,因為這個方法可以放在class或module中,記得在方法前面加上self.就行了)

* 這裡為啥有個redis-rb?因為redis是用c語言編寫的庫,而我們使用的語言是ruby,所以它的存在就是為了讓我們更容易的使用redis.

* resque生效的必要條件:啟動redis-server,執行rake resque:work或resque:workers監聽。

**:

Ios後台任務執行實現

首先你應該定義如下兩個變數 uibackgroundtaskidentifier m taskid 後台任務id bool m brun 是否有後台任務執行的標誌其次,你需要寫如下幾個函式,用來判斷和啟動後台任務 bool ismultitaskingsupported return bresult...

執行後台任務的利器 Hangfire

今年1月31日,在微軟的mvp 2015社群大講堂上,我給大家分享了乙個演講 在asp.net應用中執行後台任務。其中介紹了三種技術的應用 queuebackgroundworkitem hangfire和azure webjobs。當時由於時間關係,對三者都是簡要介紹。今天想和大家著重介紹下han...

執行後台任務的利器 Hangfire

hangfire是乙個開源且商業免費使用的工具函式庫。可以讓你非常容易地在asp.net應用 也可以不在asp.net應用 中執行多種型別的後台任務,而無需自行定製開發和管理基於windows service後台任務執行器。且任務資訊可以被持久儲存。內建提供整合化的控制台。通過nuget就可以在你的...