亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Web應(yīng)用異步任務(wù)處理的實(shí)現(xiàn)研究

        2012-08-20 05:18:46張文梅廖福保
        關(guān)鍵詞:待處理空閑線(xiàn)程

        張文梅,廖福保

        (廣東農(nóng)工商職業(yè)技術(shù)學(xué)院 機(jī)電系,廣東 廣州 510507)

        在Web應(yīng)用中,某些功能的實(shí)現(xiàn)邏輯很復(fù)雜、執(zhí)行比較耗時(shí)[1],例如涉及外部系統(tǒng)調(diào)用、多數(shù)據(jù)源等;此時(shí),希望可以讓這些復(fù)雜的業(yè)務(wù)邏輯放在后臺(tái)執(zhí)行,而前臺(tái)與用戶(hù)的交互可以不用等待,從而提高用戶(hù)體驗(yàn);或者需要以一定時(shí)間間隔重復(fù)運(yùn)行任務(wù)、或在每天的指定時(shí)間運(yùn)行任務(wù)的情況。為此,需要控制大型任務(wù)對(duì)服務(wù)器資源的消耗,降低Web服務(wù)器的并發(fā)連接數(shù)目,這就需要將大型任務(wù)的提交和執(zhí)行分開(kāi),使服務(wù)器接受任務(wù)后立即斷開(kāi)與客戶(hù)端的連接,減少服務(wù)器的并發(fā)連接數(shù),而任務(wù)則推遲到服務(wù)器資源許可時(shí)執(zhí)行,以抑制服務(wù)器資源的峰值消耗。

        為盡量減少耗時(shí)操作對(duì)執(zhí)行的影響,本文提出了異步任務(wù)的處理,使用多線(xiàn)程來(lái)管理耗時(shí)任務(wù),作為后臺(tái)進(jìn)程執(zhí)行;同時(shí)把任務(wù)信息都持久化在數(shù)據(jù)庫(kù)中,保證了異步任務(wù)處理的靈活性、可靠性。

        1 多線(xiàn)程

        1.1 線(xiàn)程池

        一個(gè)線(xiàn)程是程序中的一條執(zhí)行流,是操作系統(tǒng)分配處理器的基本單位。并發(fā)是程序中多條執(zhí)行流的同時(shí)推進(jìn),多任務(wù)并發(fā)對(duì)應(yīng)多線(xiàn)程并發(fā)[2]。

        但是為每個(gè)任務(wù)創(chuàng)建一個(gè)線(xiàn)程,當(dāng)任務(wù)完成時(shí)撤消對(duì)應(yīng)的線(xiàn)程存在明顯的缺陷。線(xiàn)程的創(chuàng)建需要一定的時(shí)間,給任務(wù)請(qǐng)求的響應(yīng)帶來(lái)延遲,線(xiàn)程的創(chuàng)建和撤消也給操作系統(tǒng)帶來(lái)額外的管理負(fù)擔(dān),若頻繁 “創(chuàng)建和撤消”,則將明顯增加系統(tǒng)的額外開(kāi)銷(xiāo)。為有效降低線(xiàn)程重復(fù)創(chuàng)建和撤銷(xiāo)方面的開(kāi)支可以采用線(xiàn)程池技術(shù)。

        線(xiàn)程池技術(shù)提供了一種較好的解決方案[3]:系統(tǒng)維護(hù)由若干個(gè)線(xiàn)程組成的線(xiàn)程池。當(dāng)有任務(wù)請(qǐng)求到達(dá)時(shí),由池中的一個(gè)線(xiàn)程為之運(yùn)行,在任務(wù)完成后不是將該線(xiàn)程撤消而是將其歸還線(xiàn)程池,使之能夠?yàn)楹罄m(xù)到達(dá)的任務(wù)服務(wù);若線(xiàn)程池中沒(méi)有空閑的線(xiàn)程,則任務(wù)進(jìn)入等待狀態(tài)直到有空閑的線(xiàn)程。

        1.2 Java中的線(xiàn)程池實(shí)現(xiàn)機(jī)制

        Java在語(yǔ)言級(jí)實(shí)現(xiàn)了功能豐富的多線(xiàn)程編程機(jī)制[4],對(duì)線(xiàn)程池的建立和維護(hù)提供了強(qiáng)大的支持。特別在JDK1.5及以后的版本中,任務(wù)執(zhí)行抽象的首選不再是Thread,而是Executor。Executor雖是一個(gè)簡(jiǎn)單的接口,但它提供了異步任務(wù)執(zhí)行框架并支持多種不同類(lèi)型的任務(wù)執(zhí)行策略,ExecutorService接口和ScheduledExecutorService接口對(duì)Executor進(jìn)行了擴(kuò)展,添加了管理線(xiàn)程執(zhí)行和調(diào)度線(xiàn)程池的若干方法。通過(guò)Executors工具類(lèi)提供的靜態(tài)工廠(chǎng)方法可以創(chuàng)建符合特定需求的基于線(xiàn)程池執(zhí)行框架。

        newChachedThreadPool()方法用于創(chuàng)建可緩存線(xiàn)程池的執(zhí)行框架。當(dāng)新的請(qǐng)求任務(wù)到達(dá)時(shí),執(zhí)行框架將盡可能地重用池中的空閑線(xiàn)程,若此時(shí)池中沒(méi)有空閑線(xiàn)程,則添加新線(xiàn)程,這個(gè)方法對(duì)池的大小沒(méi)有限制。另一方面,該執(zhí)行框架能夠自動(dòng)回收空閑時(shí)間超過(guò)60 s的線(xiàn)程,以合理使用系統(tǒng)資源。對(duì)于執(zhí)行大量短異步任務(wù)的程序而言,這種方式的線(xiàn)程池通??商岣咝阅堋?/p>

        newFixedThreadPool(int nThreads)方法建立的執(zhí)行框架中的線(xiàn)程池具有固定數(shù)量的線(xiàn)程。每提交一個(gè)任務(wù)它就創(chuàng)建一個(gè)線(xiàn)程,直到達(dá)到池的限定值nThreads,線(xiàn)程池的長(zhǎng)度不再變化,新到達(dá)的任務(wù)在一個(gè)遵循先來(lái)先服務(wù)(FIFS)規(guī)則的無(wú)界隊(duì)列中等待執(zhí)行。

        newScheduledThreadPool(int nThreads)方法建立的執(zhí)行框架中的線(xiàn)程池也是定長(zhǎng)的,它支持定時(shí)的以及周期性的任務(wù)的執(zhí)行。

        這些工廠(chǎng)方法返回的Executor都是ThreadPoolExecutor()類(lèi)的常用實(shí)例,能滿(mǎn)足大部分線(xiàn)程池的應(yīng)用需求。

        2 設(shè)計(jì)思路

        為保證異步任務(wù)處理的靈活性和可靠性,本文設(shè)計(jì)的思路為:任務(wù)持久化+Java線(xiàn)程池+任務(wù)調(diào)度。

        2.1 任務(wù)持久化

        將待處理的任務(wù)信息保存在可信任的數(shù)據(jù)庫(kù)中,同時(shí)要確保當(dāng)任務(wù)處理服務(wù)器出問(wèn)題后這些未執(zhí)行成功、或未開(kāi)始執(zhí)行的任務(wù)不會(huì)被丟失。

        2.2 任務(wù)調(diào)度

        當(dāng)任務(wù)信息都持久化在數(shù)據(jù)庫(kù)中之后,需要將這些信息讀取出來(lái)執(zhí)行具體的業(yè)務(wù)邏輯操作,本文通過(guò)ScheduledExecutorService來(lái)實(shí)現(xiàn)對(duì)任務(wù)的循環(huán)調(diào)度,例如可采取每隔2 min掃描一次待處理任務(wù)列表,若有記錄則提取出來(lái)執(zhí)行。

        3 具體實(shí)現(xiàn)

        異步任務(wù)處理中各組成部分在運(yùn)行過(guò)程中的調(diào)用關(guān)系如圖1。

        圖1 異步任務(wù)處理中的調(diào)用關(guān)系

        當(dāng)客戶(hù)端訪(fǎng)問(wèn)服務(wù)器時(shí),有耗時(shí)操作的任務(wù),則把該任務(wù)放入數(shù)據(jù)庫(kù)中。服務(wù)器每隔一段時(shí)間輪詢(xún)存放待處理任務(wù)的表,若表中有任務(wù),則任務(wù)調(diào)度線(xiàn)程池采用多線(xiàn)程機(jī)制來(lái)執(zhí)行該任務(wù)。任務(wù)執(zhí)行成功后,刪除待處理任務(wù)表中的該任務(wù)信息,否則把該任務(wù)信息更新到任務(wù)失敗表,進(jìn)行人工干預(yù)。

        3.1 任務(wù)數(shù)據(jù)表

        建兩張表,一張task表,用來(lái)存放待處理的任務(wù);一張task_fail表用來(lái)存放失敗的任務(wù)。兩張表的結(jié)構(gòu)一樣,結(jié)構(gòu)如表1所示。

        表1 task和task_fail數(shù)據(jù)表結(jié)構(gòu)

        task表主要用來(lái)保存所有待處理的任務(wù),每條任務(wù)信息屬于一種任務(wù)類(lèi)型,由task_handle字段標(biāo)識(shí),任務(wù)類(lèi)型值為該類(lèi)型任務(wù)的具體實(shí)現(xiàn)類(lèi)名。task_params字段提供了執(zhí)行該任務(wù)需要的所有參數(shù),為字符串,需要在具體任務(wù)實(shí)現(xiàn)類(lèi)中解析。handle_time字段提供了任務(wù)待執(zhí)行的日期。

        每條任務(wù)被執(zhí)行之后根據(jù)執(zhí)行情況進(jìn)行刪除或者更新操作,任務(wù)成功執(zhí)行,就從task表中刪除該記錄。Task_fail表主要用來(lái)保存執(zhí)行失敗、需要人工干預(yù)的任務(wù)記錄,記錄來(lái)源于task表。

        3.2 任務(wù)處理過(guò)程

        任務(wù)處理的過(guò)程如圖2所示。

        (1)當(dāng)服務(wù)器啟動(dòng)后,根據(jù)調(diào)度策略每隔一段時(shí)間調(diào)度一次,而不管上次調(diào)度是否已經(jīng)執(zhí)行完畢;任務(wù)輪詢(xún)主線(xiàn)程查詢(xún)task表,從中取出一定條的數(shù)據(jù)。

        (2)對(duì)從task表中查詢(xún)出來(lái)的每條記錄,將該條記錄的ID放進(jìn)本地cache中,根據(jù)記錄中task_handle和task_params字段的值獲得處理該任務(wù)對(duì)應(yīng)的類(lèi)及參數(shù)值,在異步線(xiàn)程池中利用反射機(jī)制來(lái)執(zhí)行任務(wù)。

        (3)具體處理類(lèi)對(duì)該任務(wù)處理完成之后返回結(jié)果,系統(tǒng)對(duì)tasks表中該條記錄進(jìn)行刪除,同時(shí)將cache中的記錄ID清除、避免cache無(wú)限膨脹。若任務(wù)處理失敗,系統(tǒng)就把該條記錄插入到task_fail表中,以備人工干預(yù)。

        (4)當(dāng)?shù)竭_(dá)下次執(zhí)行時(shí)間時(shí),再次掃描tasks表,循環(huán)上面的邏輯。不過(guò)這次在任務(wù)處理之前,要先在本地cache中查詢(xún)是否該條記錄正在被處理,若cache中已經(jīng)存在該條記錄就無(wú)需處理了,以避免一些任務(wù)被重復(fù)并發(fā)執(zhí)行。

        3.3 任務(wù)輪詢(xún)主線(xiàn)程的實(shí)現(xiàn)

        Executor的靜態(tài)方法生成一個(gè)固定的線(xiàn)程池。線(xiàn)程池的線(xiàn)程是不會(huì)釋放的,即使它空閑,這就會(huì)產(chǎn)生性能問(wèn)題,如果線(xiàn)程池的大小為200,當(dāng)全部使用完畢后,所有的線(xiàn)程會(huì)繼續(xù)留在池中,相應(yīng)的內(nèi)存和線(xiàn)程切換都會(huì)增加。如果要避免這個(gè)問(wèn)題,就必須直接使用Thread-PoolExecutor()來(lái)構(gòu)造,設(shè)置“最大線(xiàn)程數(shù)”、“最小線(xiàn)程數(shù)”和“空閑線(xiàn)程存活的時(shí)間”。

        為了線(xiàn)程池能按時(shí)間計(jì)劃來(lái)執(zhí)行任務(wù),允許用戶(hù)設(shè)定計(jì)劃執(zhí)行任務(wù)的時(shí)間,就要使用newScheduledThread-Pool(int nThreads)方法返回 ThreadPoolExecutor類(lèi)的實(shí)例。參數(shù)nThreads是設(shè)定線(xiàn)程池中線(xiàn)程的最小數(shù)目,當(dāng)任務(wù)較多時(shí),線(xiàn)程池會(huì)自動(dòng)創(chuàng)建更多的工作線(xiàn)程來(lái)執(zhí)行任務(wù)。其關(guān)鍵代碼如下:

        3.4 執(zhí)行任務(wù)線(xiàn)程池的實(shí)現(xiàn)

        執(zhí)行任務(wù)的線(xiàn)程池采用newFixedThreadPool(int nThreads)方法建立,線(xiàn)程池具有固定數(shù)量。關(guān)鍵代碼如下:

        對(duì)于任務(wù)的生產(chǎn)者,只需要向Task表中insert記錄即可,操作簡(jiǎn)單。待執(zhí)行任務(wù)信息在可靠數(shù)據(jù)庫(kù)中保存,即使任務(wù)處理出了問(wèn)題也不會(huì)讓未處理的任務(wù)信息丟失。

        本文利用Executor接口提供的異步任務(wù)執(zhí)行框架和任務(wù)執(zhí)行策略,實(shí)現(xiàn)多任務(wù)的執(zhí)行。在為具體應(yīng)用線(xiàn)程池時(shí)往往需要根據(jù)應(yīng)用的需求和處理任務(wù)的特點(diǎn)來(lái)優(yōu)化線(xiàn)程池的使用,設(shè)置合適的 “最大線(xiàn)程數(shù)”、“最小線(xiàn)程數(shù)”和“空閑線(xiàn)程存活的時(shí)間”,采用不同的策略調(diào)整線(xiàn)程池的工作線(xiàn)程數(shù),才能達(dá)到最好的效果。

        [1]于國(guó)良.建立高性能擴(kuò)展的Web應(yīng)用系統(tǒng)[J].微計(jì)算機(jī)信息,2006,18(04):63-64.

        [2]鄭扣根.操作系統(tǒng)概論[M].北京:高等教育出版社,2004.

        [3]王華,馬亮,顧明.線(xiàn)程池技術(shù)研究與應(yīng)用[J].計(jì)算機(jī)應(yīng)用研究,2005(11):141-145.

        [4]Sun Microsystems Inc.Java Platform,Standard Edition 6 API Specification[EB/OL].(2011-12-20).http://java.sun.com/javase/6/docs/api/index.Html,2008.

        猜你喜歡
        待處理空閑線(xiàn)程
        恩賜
        詩(shī)選刊(2023年7期)2023-07-21 07:03:38
        財(cái)產(chǎn)清查結(jié)果的賬務(wù)處理
        “鳥(niǎo)”字謎
        小讀者之友(2019年9期)2019-09-10 07:22:44
        彪悍的“寵”生,不需要解釋
        “待處理”事項(xiàng)在科學(xué)事業(yè)單位的核算探討
        政府會(huì)計(jì)核算中待處理財(cái)產(chǎn)損溢賬戶(hù)應(yīng)用探究
        淺談linux多線(xiàn)程協(xié)作
        WLAN和LTE交通規(guī)則
        CHIP新電腦(2016年3期)2016-03-10 14:09:48
        無(wú)法收回的房租押金,應(yīng)怎樣進(jìn)行賬務(wù)處理
        Linux線(xiàn)程實(shí)現(xiàn)技術(shù)研究
        亚洲国产成人久久综合电影| 日本一区二区三区不卡在线| 日韩亚洲无吗av一区二区| 成熟丰满熟妇av无码区| 国产精品嫩草影院av| 久久精品国产6699国产精| 亚洲av有码精品天堂| 一本色道久久88加勒比| 极品老师腿张开粉嫩小泬| 久久aⅴ人妻少妇嫩草影院| 夜夜被公侵犯的美人妻| 亚洲天堂免费一二三四区| 国产精品亚洲一区二区三区在线| 精品无码久久久久久久久水蜜桃| 99国产精品无码| 日韩亚洲制服丝袜中文字幕| 久久久国产精品五月天伊人| 国产三级不卡一区不卡二区在线| 亚洲av首页在线| 台湾佬娱乐中文22vvvv| 91日本在线精品高清观看| 亚洲av天堂一区二区| 欧美奶涨边摸边做爰视频| 国产精品v欧美精品v日韩精品 | 国产三级不卡一区不卡二区在线| 日韩av无码中文无码电影| 精品一区二区三区芒果| 国产精品99精品无码视亚| 国产激情з∠视频一区二区| 无码人妻少妇久久中文字幕| 精品福利一区二区三区| 小说区激情另类春色| 国产在线精品一区二区| 国产日韩AV无码免费一区二区| 国产亚洲精品一区二区在线观看 | 日韩中文字幕久久久经典网 | 色爱无码A V 综合区| av免费网站不卡观看| 亚洲综合av一区二区三区蜜桃| 亚洲国产另类精品| 精品国产一区二区三区亚洲人|