国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

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

黎穎智,史彩霞,劉世學(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)一訪問接口(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ù)需通過進(jìn)行基礎(chǔ)數(shù)據(jù)再加工,CIMISS提供的數(shù)據(jù)有時(shí)候并不能直接拿來使用。另外,由于CIMISS資料部署在國(guó)家和省級(jí)數(shù)據(jù)中心,地縣級(jí)部門在使用數(shù)據(jù)時(shí)也可能會(huì)到受網(wǎng)絡(luò)異常因素的影響。因此,如何在不影響用戶體驗(yàn)的前提下,采用異步多線程的方法快速?gòu)腃IMISS中讀取數(shù)據(jù)并加工錄入到本地?cái)?shù)據(jù)庫中便是本文需要解決的問題。

2 技術(shù)線路

氣象數(shù)據(jù)統(tǒng)一服務(wù)接口(MUSIC)提供多種不同的服務(wù)方式,包括客戶端調(diào)用服務(wù)、web service、REST服務(wù)和腳本服務(wù)。提供多種語言的客戶端開發(fā)包,包括 C#、Java、C/C++、Fortran、PHP、Python 等。本文以REST服務(wù)和C#為例用于開發(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)的主界面無響應(yīng)問題,批量數(shù)據(jù)的快速入庫則采用SqlBulkCopy來實(shí)現(xiàn)。

2.1 多線程

如圖1所示,線程的生命周期分為新建、就緒、運(yùn)行、阻塞、死亡五個(gè)階段。單線程程序,是順序執(zhí)行的,前一操作是否順暢會(huì)影響到后面的操作,一旦發(fā)生阻塞便會(huì)使整個(gè)程序無法操作。如采用多線程異步執(zhí)行則可避免阻塞。多線程是使用多個(gè)處理句柄同時(shí)對(duì)多個(gè)任務(wù)進(jìn)行控制處理的一種特別的形式,但多線程使用了更小的資源開銷。異步是指調(diào)用某一操作后,后面的操作可不等待其結(jié)果繼續(xù)執(zhí)行,如后面無其他操作則當(dāng)前線程將會(huì)睡眠,其他線程在此時(shí)則可調(diào)用cpu資源。在異步操作完成后通過回調(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)建的線程難于管理,若建立過多的線程反會(huì)影響系統(tǒng)性能,而且Thread對(duì)象也無法解決對(duì)于有返回值類型的委托的問題。

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

(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ì)于有返回值類型的委托的問題。

線程池與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)建新的線程來執(zhí)行任務(wù),直到線程池達(dá)到最大線程數(shù)(線程池滿),當(dāng)FIFO十分頻繁時(shí),會(huì)造成很大的線程管理開銷。而Task在嵌套的場(chǎng)景下,當(dāng)局部隊(duì)列中有多個(gè)task,某個(gè)task的線程執(zhí)行完任務(wù)時(shí),該空閑線程就會(huì)從同一隊(duì)列中以FIFO的形式分流和負(fù)載其他任務(wù),從而減少了線程管理的開銷。這些優(yōu)勢(shì)都是線程池所無法比擬的。

圖1 線程的生命周期

2.2 async /await

異步多線程編程最大的問題是狀態(tài)、結(jié)果跟蹤(即數(shù)據(jù)同步問題),在c#5.0之前,多線程編程相對(duì)于單線程會(huì)出現(xiàn)一個(gè)特有的問題,就是線程安全的問題。所謂的線程安全就是如果代碼所在的進(jìn)程中有多個(gè)線程在同時(shí)運(yùn)行,而這些線程可能會(huì)同時(shí)運(yùn)行這段代碼。如果每次運(yùn)行結(jié)果和單線程運(yùn)行的結(jié)果是一樣的,而且其他的變量的值也和預(yù)期的是一樣的。線程安全問題都是由全局變量及靜態(tài)變量引起的[7-8]。為了保證多線程情況下,訪問靜態(tài)變量的安全,可以用鎖機(jī)制來保證,但Lock只能鎖住一個(gè)引用類型的對(duì)象。c#5.0中加入了async和await方法來保證線程安全,async/await將多個(gè)線程進(jìn)行串行處理,等到await之后的語句執(zhí)行完成后才執(zhí)行本線程的其他語句。async/await使得建立一個(gè)同時(shí)具備可讀性與可維護(hù)性的異步解決方案變得很簡(jiǎn)單。以下是用async/await編寫的定時(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語句至少快數(shù)十倍。SqlBulkCopy類僅用于向SQL Server表中寫入數(shù)據(jù)。但是數(shù)據(jù)的來源卻不局限SQL Server,只要能載入DataTable實(shí)例讀取的任何數(shù)據(jù)來源均可。Microsoft SQL Server數(shù)據(jù)庫的bcp的常用命令行應(yīng)用工具提供了用于快速批量復(fù)制錄入大文件數(shù)據(jù)到庫表或視圖以及格式文件導(dǎo)出等功能。SqlBulkCopy類可以編寫提供與其相似的功能的托管代碼解決方案。

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

3 小結(jié)

隨著CIMISS在氣象領(lǐng)域的應(yīng)用不斷加深,各級(jí)氣象部門中無論是普通業(yè)務(wù)還是科研項(xiàng)目研究都將不可避免的涉及到CIMISS的使用,創(chuàng)建一個(gè)保證數(shù)據(jù)安全并提供快速穩(wěn)定的數(shù)據(jù)接入環(huán)境是十分必要的,本文通過探討如何采用多線程異步編程快速錄入數(shù)據(jù),為各氣象業(yè)務(wù)與科研項(xiàng)目在解決類似問題時(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)開發(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è)病蟲害氣象服務(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.

猜你喜歡
線程語句氣象
氣象樹
《內(nèi)蒙古氣象》征稿簡(jiǎn)則
重點(diǎn):語句銜接
氣象戰(zhàn)士之歌
心聲歌刊(2019年5期)2020-01-19 01:52:52
大國(guó)氣象
精彩語句
淺談linux多線程協(xié)作
如何搞定語句銜接題
Linux線程實(shí)現(xiàn)技術(shù)研究
么移動(dòng)中間件線程池并發(fā)機(jī)制優(yōu)化改進(jìn)
兴化市| 平和县| 察哈| 丰镇市| 哈密市| 平南县| 桐乡市| 喀什市| 平潭县| 留坝县| 东山县| 扶绥县| 扎囊县| 竹北市| 肇东市| 青州市| 瑞金市| 隆子县| 博湖县| 唐海县| 平泉县| 彰化市| 色达县| 从化市| 东乡县| 甘南县| 通辽市| 隆安县| 康保县| 龙州县| 门头沟区| 龙川县| 红桥区| 郑州市| 乳源| 洞口县| 班玛县| 任丘市| 克拉玛依市| 花垣县| 揭阳市|