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

        ?

        關(guān)于異步多線程快速提取CIMISS數(shù)據(jù)入庫(kù)方法的研究與應(yīng)用

        2018-05-16 06:47:38黎穎智史彩霞劉世學(xué)
        氣象研究與應(yīng)用 2018年1期
        關(guān)鍵詞:線程語(yǔ)句氣象

        黎穎智,史彩霞,劉世學(xué)

        (廣西氣象服務(wù)中心,廣西 南寧 530022)

        1 引言

        全國(guó)綜合氣象信息共享系統(tǒng)(CIMISS)是中國(guó)氣象局建設(shè)的集氣象資料采集、加工處理、存儲(chǔ)管理和共享服務(wù)等功能于一身的氣象信息業(yè)務(wù)平臺(tái)。能夠?yàn)閲?guó)、省、地、縣各級(jí)氣象科研部門提供規(guī)范統(tǒng)一高效的氣象數(shù)據(jù)。雖然氣象數(shù)據(jù)統(tǒng)一訪問(wèn)接口(MUSIC),為各級(jí)應(yīng)用系統(tǒng)提供了包括實(shí)時(shí)觀測(cè)數(shù)據(jù)、各業(yè)務(wù)單位產(chǎn)品數(shù)據(jù)、和整編歷史數(shù)據(jù)在內(nèi)的基礎(chǔ)數(shù)據(jù)的接入服務(wù)[1-4]。但是由于部分科研項(xiàng)目或?qū)I(yè)服務(wù)所需要數(shù)據(jù)格式的不同或者所需要的數(shù)據(jù)需通過(guò)進(jìn)行基礎(chǔ)數(shù)據(jù)再加工,CIMISS提供的數(shù)據(jù)有時(shí)候并不能直接拿來(lái)使用。另外,由于CIMISS資料部署在國(guó)家和省級(jí)數(shù)據(jù)中心,地縣級(jí)部門在使用數(shù)據(jù)時(shí)也可能會(huì)到受網(wǎng)絡(luò)異常因素的影響。因此,如何在不影響用戶體驗(yàn)的前提下,采用異步多線程的方法快速?gòu)腃IMISS中讀取數(shù)據(jù)并加工錄入到本地?cái)?shù)據(jù)庫(kù)中便是本文需要解決的問(wèn)題。

        2 技術(shù)線路

        氣象數(shù)據(jù)統(tǒng)一服務(wù)接口(MUSIC)提供多種不同的服務(wù)方式,包括客戶端調(diào)用服務(wù)、web service、REST服務(wù)和腳本服務(wù)。提供多種語(yǔ)言的客戶端開(kāi)發(fā)包,包括 C#、Java、C/C++、Fortran、PHP、Python 等。本文以REST服務(wù)和C#為例用于開(kāi)發(fā)研究[1-4]。REST服務(wù)用于從CIMISS中提取數(shù)據(jù)到本機(jī)內(nèi)存對(duì)象中,而C#5.0新特性async和await進(jìn)行異步操作實(shí)現(xiàn)主線程與方法線程的并行執(zhí)行,解決提取CIMISS數(shù)據(jù)時(shí)出現(xiàn)的主界面無(wú)響應(yīng)問(wèn)題,批量數(shù)據(jù)的快速入庫(kù)則采用SqlBulkCopy來(lái)實(shí)現(xiàn)。

        2.1 多線程

        如圖1所示,線程的生命周期分為新建、就緒、運(yùn)行、阻塞、死亡五個(gè)階段。單線程程序,是順序執(zhí)行的,前一操作是否順暢會(huì)影響到后面的操作,一旦發(fā)生阻塞便會(huì)使整個(gè)程序無(wú)法操作。如采用多線程異步執(zhí)行則可避免阻塞。多線程是使用多個(gè)處理句柄同時(shí)對(duì)多個(gè)任務(wù)進(jìn)行控制處理的一種特別的形式,但多線程使用了更小的資源開(kāi)銷。異步是指調(diào)用某一操作后,后面的操作可不等待其結(jié)果繼續(xù)執(zhí)行,如后面無(wú)其他操作則當(dāng)前線程將會(huì)睡眠,其他線程在此時(shí)則可調(diào)用cpu資源。在異步操作完成后通過(guò)回調(diào)函數(shù)的方式獲取通知與結(jié)果[5-6]。在C#編程中實(shí)現(xiàn)多線程的方法有以下幾種:

        (1)直接用Thread類創(chuàng)建;Thread newThread =new Thread(new ThreadStart(() =>{})),參數(shù)為一個(gè)ThreadStart類型的委托。這是最簡(jiǎn)單的方法,但使用該方法創(chuàng)建的線程難于管理,若建立過(guò)多的線程反會(huì)影響系統(tǒng)性能,而且Thread對(duì)象也無(wú)法解決對(duì)于有返回值類型的委托的問(wèn)題。

        (2)線程池(thread pool):線程池是通過(guò)線程共享與回收機(jī)制來(lái)減少性能開(kāi)銷。當(dāng)程序要新建線程來(lái)執(zhí)行任務(wù)時(shí),線程池才初始化一個(gè)線程。在完成任務(wù)以后,該線程不會(huì)自行銷毀,而是以掛起的方式返回到線程池中等待程序再次向線程池發(fā)出請(qǐng)求時(shí)再度被激活。這樣既節(jié)省了建立線程形成的性能損耗,也可以讓多任務(wù)復(fù)用同一線程,從而節(jié)省大量的開(kāi)銷。

        (3)Task方式:此方式通常用于需要循環(huán)執(zhí)行任務(wù)并需要獲取執(zhí)行后的結(jié)果。Task最大的優(yōu)點(diǎn)就是任務(wù)能夠控制task的執(zhí)行順序,使多個(gè)任務(wù)有序運(yùn)行。與Thread對(duì)象相比,Task對(duì)象則可輕松解決對(duì)于有返回值類型的委托的問(wèn)題。

        線程池與Task的比較:

        線程池中每一次QueueUserWorkItem的使用都會(huì)產(chǎn)生一個(gè)工作項(xiàng)進(jìn)入全局隊(duì)列進(jìn)行排隊(duì),最后線程池中的的工作線程以FIFO(First Input First Output)的形式取出,任務(wù)委托的線程池不光有全局隊(duì)列,而且每一個(gè)工作線程都有局部隊(duì)列。當(dāng)線程不足時(shí),線程池就會(huì)創(chuàng)建新的線程來(lái)執(zhí)行任務(wù),直到線程池達(dá)到最大線程數(shù)(線程池滿),當(dāng)FIFO十分頻繁時(shí),會(huì)造成很大的線程管理開(kāi)銷。而Task在嵌套的場(chǎng)景下,當(dāng)局部隊(duì)列中有多個(gè)task,某個(gè)task的線程執(zhí)行完任務(wù)時(shí),該空閑線程就會(huì)從同一隊(duì)列中以FIFO的形式分流和負(fù)載其他任務(wù),從而減少了線程管理的開(kāi)銷。這些優(yōu)勢(shì)都是線程池所無(wú)法比擬的。

        圖1 線程的生命周期

        2.2 async /await

        異步多線程編程最大的問(wèn)題是狀態(tài)、結(jié)果跟蹤(即數(shù)據(jù)同步問(wèn)題),在c#5.0之前,多線程編程相對(duì)于單線程會(huì)出現(xiàn)一個(gè)特有的問(wèn)題,就是線程安全的問(wèn)題。所謂的線程安全就是如果代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的。線程安全問(wèn)題都是由全局變量及靜態(tài)變量引起的[7-8]。為了保證多線程情況下,訪問(wèn)靜態(tài)變量的安全,可以用鎖機(jī)制來(lái)保證,但Lock只能鎖住一個(gè)引用類型的對(duì)象。c#5.0中加入了async和await方法來(lái)保證線程安全,async/await將多個(gè)線程進(jìn)行串行處理,等到await之后的語(yǔ)句執(zhí)行完成后才執(zhí)行本線程的其他語(yǔ)句。async/await使得建立一個(gè)同時(shí)具備可讀性與可維護(hù)性的異步解決方案變得很簡(jiǎn)單。以下是用async/await編寫(xiě)的定時(shí)自動(dòng)錄入數(shù)據(jù)線程的主要實(shí)現(xiàn)代碼:

        如上代碼所示,在c#5.0中定義異步方法和定義同步方法一樣簡(jiǎn)單,在timer1_Tick使用關(guān)鍵字await可讓<DataTable>和<ListViewItem>任務(wù)線程在后臺(tái)運(yùn)行而不會(huì)堵塞UI線程,避免出現(xiàn)UI主界面卡死的現(xiàn)象出現(xiàn)。

        2.3 SqlBulkCopy

        SqlBulkCopy功能非常強(qiáng)大,具有快速且高效能夠批量插入數(shù)據(jù)性能,較之傳統(tǒng)的使用SQL語(yǔ)句至少快數(shù)十倍。SqlBulkCopy類僅用于向SQL Server表中寫(xiě)入數(shù)據(jù)。但是數(shù)據(jù)的來(lái)源卻不局限SQL Server,只要能載入DataTable實(shí)例讀取的任何數(shù)據(jù)來(lái)源均可。Microsoft SQL Server數(shù)據(jù)庫(kù)的bcp的常用命令行應(yīng)用工具提供了用于快速批量復(fù)制錄入大文件數(shù)據(jù)到庫(kù)表或視圖以及格式文件導(dǎo)出等功能。SqlBulkCopy類可以編寫(xiě)提供與其相似的功能的托管代碼解決方案。

        在SqlBulkCopy類出現(xiàn)前,C#在Sqlserver中批量插入數(shù)據(jù)一般采用的是使用sql語(yǔ)句insert循環(huán)逐條插入的方法,經(jīng)過(guò)實(shí)驗(yàn)發(fā)現(xiàn)插入一百萬(wàn)條數(shù)據(jù),大概需要52分鐘左右,每插入一條數(shù)據(jù)耗時(shí)約3毫秒。而采用SqlBulkCopy插入同樣數(shù)量級(jí)的數(shù)據(jù)僅耗時(shí)8秒。由此可見(jiàn)與常用insert語(yǔ)句相較,在需要插入數(shù)十萬(wàn)百萬(wàn)數(shù)據(jù)的時(shí)候,利用insert插入的速度十分慢的。其原因除了SqlBulkCopy原理是采用了SQL Server的bcp協(xié)議進(jìn)行數(shù)據(jù)的批量復(fù)制之外,還在于insert語(yǔ)句在for循環(huán)中直接進(jìn)行數(shù)據(jù)庫(kù)操作,數(shù)據(jù)庫(kù)的每一次連接、打開(kāi)及關(guān)閉都是相當(dāng)耗時(shí)的,雖然在C#中存在數(shù)據(jù)庫(kù)連接池,也就是當(dāng)使用using或者conn.Close()進(jìn)行釋放連接時(shí),其實(shí)并非真正關(guān)閉數(shù)據(jù)庫(kù)連接,連接以類似于休眠的方式存在,當(dāng)需要再次操作的時(shí)候,會(huì)從連接池將其喚醒。而SqlBulkCopy無(wú)需使用循環(huán),便不存在這類的損耗。

        3 小結(jié)

        隨著CIMISS在氣象領(lǐng)域的應(yīng)用不斷加深,各級(jí)氣象部門中無(wú)論是普通業(yè)務(wù)還是科研項(xiàng)目研究都將不可避免的涉及到CIMISS的使用,創(chuàng)建一個(gè)保證數(shù)據(jù)安全并提供快速穩(wěn)定的數(shù)據(jù)接入環(huán)境是十分必要的,本文通過(guò)探討如何采用多線程異步編程快速錄入數(shù)據(jù),為各氣象業(yè)務(wù)與科研項(xiàng)目在解決類似問(wèn)題時(shí)提供了一種可以參考的可行技術(shù)方案。

        參考文獻(xiàn):

        [1]曹威,張冰松,李鑫.基于CIMISS的省市縣三級(jí)氣象信息傳輸監(jiān)控系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].信息與電腦(理論版),2017,(21):73-76..

        [2]李志鵬,胡佳軍,楊立苑,李顯風(fēng),鄧衛(wèi)華.基于CIMISS的氣象數(shù)據(jù)處理時(shí)效監(jiān)視系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].氣象與減災(zāi)研究,2016,39(04):309-313.

        [3]王宏記,楊代才.基于CIMISS的長(zhǎng)江流域氣象水文信息共享系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)研究 [J].安徽農(nóng)業(yè)科學(xué),2014,42(32):11565-11570.

        [4]]榮裕良,張霞,馬忠芬,薛正平.松江智慧氣象為農(nóng)服務(wù)系統(tǒng)開(kāi)發(fā)研究[J].氣象研究與應(yīng)用,2017,38(1):102-106.

        [5]C#程序設(shè)計(jì)經(jīng)典教程 [M].清華大學(xué)出版社,羅福強(qiáng),2011.

        [6] 陳翠娥,王學(xué)伶.C# 屬性、特性和反射的應(yīng)用研究[J].電腦與電信,2015,(9):51-53.

        [7]彭慶喜,陳軍威,周威.基于C#多線程的Web實(shí)體抽取設(shè)計(jì)與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2013,12(01):84-86.

        [8]秦江林,符合,楊秀好,楊忠武,羅同基,雷秀峰.林業(yè)病蟲(chóng)害氣象服務(wù)系統(tǒng)的創(chuàng)新設(shè)計(jì)與應(yīng)用 [J].氣象研究與應(yīng)用,2017,38(2):57-60.

        [9]石濤,劉軍,張麗,陳金華.基于GIS和意愿調(diào)查法的氣象為農(nóng)服務(wù)效益評(píng)估 [J]. 氣象研究與應(yīng)用,2016,37(4):86-89+131.

        猜你喜歡
        線程語(yǔ)句氣象
        氣象
        氣象樹(shù)
        《內(nèi)蒙古氣象》征稿簡(jiǎn)則
        重點(diǎn):語(yǔ)句銜接
        大國(guó)氣象
        精彩語(yǔ)句
        淺談linux多線程協(xié)作
        如何搞定語(yǔ)句銜接題
        Linux線程實(shí)現(xiàn)技術(shù)研究
        么移動(dòng)中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
        伊人青青草综合在线视频免费播放| 精产国品一二三产品蜜桃| 国产肥熟女视频一区二区三区| 91麻豆国产香蕉久久精品| 欧美洲精品亚洲精品中文字幕| 日本女同视频一区二区三区| 国产精品久久久久久人妻无| 自拍偷自拍亚洲精品情侣| 99热成人精品国产免国语的| 日本一区二区午夜视频| 久久青青草原国产毛片| 免费观看性欧美大片无片| 国产精品18久久久久久不卡中国 | 国产精品电影久久久久电影网| 亚洲成av人片在线天堂无| 亚洲一区二区三区国产| 久久久久亚洲av成人网人人网站| 中国a级毛片免费观看| 福利视频一二区| 我的美艳丝袜美腿情缘| 国产私人尤物无码不卡| 日韩精品久久久肉伦网站| 国产一区二区精品在线观看| 日本韩国三级aⅴ在线观看| 国产一区二区免费在线观看视频 | 色妺妺在线视频| 亚洲性啪啪无码AV天堂| 搞黄色很刺激的网站二区| 国产欧美日韩一区二区加勒比| 免费无码午夜福利片69| 中文字幕天堂在线| 国产精品很黄很色很爽的网站| 人妻少妇偷人精品久久性色av| 久久久久久久综合综合狠狠| 日韩视频第二页| 极品少妇在线观看视频| 天堂8在线新版官网| 午夜福利视频合集1000| 久久青青草视频免费观看| 成人影院视频在线播放| 强开少妇嫩苞又嫩又紧九色|