WEB耗時任務的處理方案

2021-08-28 06:11:11 字數 1552 閱讀 4045

最近有乙個需求,從網頁上傳乙個文字包到後台處理,處理時長可能在幾分鐘到幾十分鐘。原來的方案就是直接接收乙個ajax請求處理資料,然後返回。遇到的問題是:經過十幾分鐘的處理後,後台返回結果到前端,前端收不到該結果了。我想應該是http連線超時了,除非長連線,沒有哪個請求可以這樣無限制地等待。於是著手改進方案,先說一下思路:

1.前端上傳檔案到後台後,後台開啟乙個子執行緒處理耗時任務,主線程直接返回結果給前端,當前請求結束,無須等待子任務的處理結果。注意這裡的返回結果只是表示檔案上傳成功,是乙個階段性的結果而已。

2.前端開啟乙個輪詢,每隔一秒查一下當前任務的處理進度,直到任務處理結束。

回答一下這個思路中的幾個關鍵點

1.輪詢檢查的依據是什麼?後台根據什麼來知道當前是誰在查詢?答案:session.對session不太了解的同學可以再做一下功課,這裡不展開。

2.主線程和新開的子執行緒之間是需要交換資料的,包括子執行緒和查詢執行緒之間也是需要交換資料的,這個交換資料是用什麼來實現?答案:httpruntime cache,對這個不熟悉的也做一下功課,這裡簡單理解為就是一塊可以共享資料的記憶體區域。

好了,思路和關鍵點都解決了,這裡再來貼一下關鍵點的**,讓大家有乙個更清晰的認識

1.開啟子執行緒       

//sessionid是作為乙個引數傳到子執行緒裡面去的,我們儲存資料到cache中是以sessionid+關鍵字的形式來做key值,而session值是不能在子執行緒中直接獲取的,所以傳進去

string sessionid = session.sessionid;

threadproc threadproc = new threadproc(sessionid);

thread thread = new thread(new threadstart(threadproc.process));

thread.isbackground = true;

thread.start();

子執行緒類:         

class threadproc

public void process()

}

2.cache的訪問

cache cache = new cache();

//讀取

result result = cache.getcache(sessionid+"result");

//儲存

cache.writecache(result,sessionid+"result");

這裡cache類是對原始httpruntime cache的一次封裝,示例如下             

public class cache

return default(t);

}public void writecache(t value,string cachekey) where t:class

}

3.輪詢處理                   

public string checkprocstate()

python2處理耗時任務 Python

方法一 usr bin env python coding utf 8 計算上乙個的時間 引入datetime,calendar兩個模組import datetime,calendar last friday datetime.date.today oneday datetime.timedelta...

web的定時任務

web開發中,總是會需要一些定時任務,比如發email 在前台等email的傳送隨時準備接受user的雷霆一怒吧 比如每月初發報表給老闆們。但是比較鬱悶的問題是,iis一段時間沒有人訪問時會 system.timers.timer也就被 掉了。1 一定要睡覺 thread.sleep 1000 10...

Web定時任務

想在web中定時 處理某些任務吧?可以在global.asax 中定義,直接上例子 script runat server void object sender,eventargs e void timer elapsed object sender,system.timers.elapsedeve...