• <tr id="yyy80"></tr>
  • <sup id="yyy80"></sup>
  • <tfoot id="yyy80"><noscript id="yyy80"></noscript></tfoot>
  • 99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看 ?

    在線測(cè)評(píng)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)

    2023-11-14 08:05:46丹,徐軻,甘
    現(xiàn)代計(jì)算機(jī) 2023年17期
    關(guān)鍵詞:隊(duì)列視圖代碼

    龍 丹,徐 軻,甘 泉

    (桂林信息科技學(xué)院信息工程學(xué)院,桂林 541004)

    0 引言

    在線測(cè)評(píng)系統(tǒng)如今為人類(lèi)社會(huì)提供了關(guān)于數(shù)據(jù)結(jié)構(gòu)、算法和數(shù)學(xué)的重要服務(wù),在學(xué)術(shù)界和工業(yè)界發(fā)揮著重要的作用,特別是在競(jìng)賽教育方面,使用在線測(cè)評(píng)系統(tǒng)的用戶的編程和思維能力得到了鍛煉和提升[1]。

    為了解決在線提交解決方案代碼的問(wèn)題,XKOJ 設(shè)計(jì)了用戶表、題目表、提交表、比賽表和博客表,構(gòu)建了完整的在線測(cè)評(píng)系統(tǒng)生態(tài)。該系統(tǒng)包含用戶注冊(cè)登錄、題目創(chuàng)建和閱讀、代碼提交驗(yàn)證、比賽創(chuàng)建和運(yùn)行、以及博客發(fā)表和瀏覽功能。該項(xiàng)目運(yùn)行在云服務(wù)器上,使用Django 框架和Redis兩個(gè)Docker容器來(lái)保證安全性和可移植性。在Django 項(xiàng)目中,提交題目使用異步任務(wù)隊(duì)列Celery 來(lái)避免在線提交解決方案可能發(fā)生的沖突。每一個(gè)需要測(cè)評(píng)的程序都通過(guò)延時(shí)進(jìn)入函數(shù),作為一個(gè)任務(wù)加入到隊(duì)列中,由隊(duì)列中的調(diào)度方案來(lái)執(zhí)行任務(wù)。通過(guò)任務(wù)文件中不同的裝飾器找到任務(wù)所需執(zhí)行的函數(shù)代碼,對(duì)提交代碼進(jìn)行編譯評(píng)測(cè),反饋結(jié)果到視圖文件中,并通過(guò)數(shù)據(jù)渲染給前端頁(yè)面,讓用戶直觀看到提交結(jié)果。

    1 測(cè)評(píng)系統(tǒng)需求與技術(shù)介紹

    1.1 服務(wù)器原理介紹

    租賃云服務(wù)器,本系統(tǒng)所運(yùn)行的環(huán)境為Ubuntu 20.04。在本地創(chuàng)建鏡像后,可以利用鏡像創(chuàng)建Docker容器,并在容器內(nèi)安裝項(xiàng)目所需的使用工具,例如Python 3、Vim 和Django-admin等。為該容器創(chuàng)建用戶并分配Sudo 權(quán)限,然后可以使用服務(wù)器端口和賬號(hào)密碼直接進(jìn)行SSH登錄。

    1.2 數(shù)據(jù)庫(kù)原理介紹

    Django 默認(rèn)使用關(guān)系型數(shù)據(jù)庫(kù)管理系統(tǒng)。其中SQLite 是默認(rèn)的數(shù)據(jù)庫(kù)引擎,它是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù),無(wú)需獨(dú)立的服務(wù)器進(jìn)程,直接存儲(chǔ)在文件中。Django 的對(duì)象關(guān)系映射提供了一種將對(duì)象映射到關(guān)系數(shù)據(jù)庫(kù)中的方法,可以將對(duì)象轉(zhuǎn)換為SQL 查詢,從而在數(shù)據(jù)庫(kù)中創(chuàng)建、讀取、更新和刪除數(shù)據(jù)。

    Django 的ORM 基于模型和字段的概念。模型表示數(shù)據(jù)庫(kù)中的一個(gè)表,而字段則表示該表中的一列。模型類(lèi)定義了模型的屬性和行為,其中屬性是模型的字段。模型類(lèi)還可以通過(guò)定義方法來(lái)實(shí)現(xiàn)模型的邏輯和行為。

    1.3 開(kāi)發(fā)工具與技術(shù)介紹

    XKOJ 為云服務(wù)器掛載Docker 中創(chuàng)建的項(xiàng)目,在Docker 中操作項(xiàng)目能簡(jiǎn)化項(xiàng)目的部署和隔離管理,提高系統(tǒng)的可擴(kuò)展性和安全性。系統(tǒng)運(yùn)用了Python 語(yǔ)言支持的Django 框架來(lái)搭建,重點(diǎn)邏輯部分有三塊內(nèi)容:模型、視圖、數(shù)據(jù)庫(kù)。通過(guò)模型定義數(shù)據(jù)的結(jié)構(gòu),視圖負(fù)責(zé)處理用戶的請(qǐng)求并返回響應(yīng),數(shù)據(jù)庫(kù)用于存儲(chǔ)應(yīng)用程序的數(shù)據(jù)[2]。通過(guò)鏈接調(diào)用對(duì)應(yīng)的視圖中的函數(shù),來(lái)實(shí)現(xiàn)后端響應(yīng)的功能,同時(shí)可以通過(guò)標(biāo)識(shí)、POST 或GET 方法獲取相應(yīng)的頁(yè)面內(nèi)容,并在加載的數(shù)據(jù)庫(kù)中找出對(duì)應(yīng)的內(nèi)容,將處理好的數(shù)據(jù)集打包傳遞給將要加載的網(wǎng)頁(yè)中。

    數(shù)據(jù)庫(kù)處理采用Django 自帶的默認(rèn)關(guān)系型數(shù)據(jù)庫(kù),通過(guò)映射的方式創(chuàng)建數(shù)據(jù)庫(kù)表,對(duì)在線測(cè)評(píng)系統(tǒng)所需的用戶、題目、比賽、博客、提交信息進(jìn)行特征封裝,并在邏輯上需要時(shí)將它們相互關(guān)聯(lián),保證信息的連通性。在項(xiàng)目完成上,使用了部分Shell 腳本來(lái)幫助管理員解決啟用系統(tǒng)文件、代碼文件與編譯文件定量刪除等;在前端頁(yè)面上自定義了絕大部分樣式代碼,引入了Ace 代碼編輯器、Markdown、Mathjax 等開(kāi)源文件增加頁(yè)面可讀性;在后端引入Celery異步任務(wù)隊(duì)列,通過(guò)創(chuàng)建任務(wù)文件編寫(xiě)任務(wù)邏輯,在視圖中將打包好數(shù)據(jù)集的任務(wù)放入隊(duì)列中進(jìn)行等待,在消息隊(duì)列空閑時(shí)將會(huì)通過(guò)自身的調(diào)度方式執(zhí)行一個(gè)任務(wù)。

    通過(guò)Docker 將開(kāi)放端口掛載Redis 緩存數(shù)據(jù)庫(kù),Celery 使用Redis 作為消息代理,將任務(wù)放入Redis 中間件隊(duì)列,并從隊(duì)列中獲取任務(wù)以進(jìn)行處理。Redis 作為消息代理,具有快速讀取和寫(xiě)入的能力,可以使得Celery 的任務(wù)執(zhí)行更加高效和快速。此外,Celery 還使用Redis 作為結(jié)果存儲(chǔ),保存任務(wù)執(zhí)行的結(jié)果和狀態(tài),以供查詢和分析。

    2 系統(tǒng)主要功能需求

    2.1 測(cè)評(píng)機(jī)需求

    測(cè)評(píng)機(jī)首先要根據(jù)提交信息的表單傳入信息,在異常處理模塊下根據(jù)聲明的數(shù)據(jù)庫(kù)變量讀取到信息數(shù)據(jù)集。程序根據(jù)使用語(yǔ)言執(zhí)行對(duì)應(yīng)的編譯指令,在創(chuàng)建的子進(jìn)程中對(duì)提交程序代碼進(jìn)行編譯,通過(guò)返回的編譯文件,在子進(jìn)程中產(chǎn)生輸出文件并與測(cè)試樣例輸出文件進(jìn)行對(duì)比,結(jié)合編譯時(shí)的信息返回相應(yīng)結(jié)果,包含通過(guò)、錯(cuò)誤、編譯錯(cuò)誤、超時(shí)、超限、程序異常[3]。

    對(duì)于多組測(cè)試用例,則需要產(chǎn)生多組子進(jìn)程來(lái)執(zhí)行編譯文件產(chǎn)生結(jié)果集,將各種情況存放在列表中,按照結(jié)果優(yōu)先級(jí)進(jìn)行反饋。

    對(duì)于沒(méi)有確定結(jié)果的題目,需要采取特殊判斷的方式,即按照用戶提交代碼產(chǎn)生的結(jié)果信息,根據(jù)題目要求邏輯,進(jìn)行驗(yàn)證程序的編寫(xiě),并將用戶提交代碼的輸出文件輸入到驗(yàn)證程序中運(yùn)行,若滿足所有條件,或輸出期望結(jié)果,則返回此提交結(jié)果正確,否則依舊根據(jù)結(jié)合編譯時(shí)的信息,按照各種情況的優(yōu)先級(jí)進(jìn)行反饋[4]。

    圖1 測(cè)評(píng)機(jī)處理任務(wù)流程

    2.2 訓(xùn)練模式與比賽模式需求

    在XKOJ中,訓(xùn)練模式對(duì)應(yīng)標(biāo)題單,比賽模式對(duì)應(yīng)比賽。在查看題目之后的所有操作都相同,但是會(huì)調(diào)用不同的測(cè)評(píng)機(jī),傳遞不同的比賽信息。在XKOJ中,視圖會(huì)根據(jù)不同的比賽ID將提交結(jié)果保存在不同比賽外鍵的表中,在后續(xù)查看比賽排名與提交信息時(shí),能夠清晰地顯示當(dāng)前比賽中的各種信息。但如果是在題單中提交代碼,則不會(huì)將其添加到任何比賽中,而是會(huì)保存在無(wú)比賽外鍵的表中,為用戶提供狀態(tài)查看與代碼查看。

    圖2 練習(xí)、比賽共用題庫(kù)模塊需求

    3 XKOJ系統(tǒng)分析與實(shí)現(xiàn)

    3.1 系統(tǒng)與數(shù)據(jù)庫(kù)表構(gòu)思

    系統(tǒng)功能總體分為四個(gè)類(lèi)別:設(shè)置、題目、博客、比賽。

    在每個(gè)類(lèi)別下,需要編寫(xiě)對(duì)應(yīng)的視圖函數(shù)實(shí)現(xiàn)需求。

    設(shè)置:登錄、登出、注冊(cè)、查看用戶信息。

    題目:查看題目列表、查看題目?jī)?nèi)容、提交解決方案、查看提交結(jié)果。

    博客:查看文章列表、編寫(xiě)博客、查看文章內(nèi)容、點(diǎn)贊、評(píng)論。

    比賽:創(chuàng)建比賽、報(bào)名、查看比賽列表、查看比賽排名、查看提交狀態(tài)。

    實(shí)現(xiàn)不同的視圖函數(shù),需要建立對(duì)應(yīng)的數(shù)據(jù)表,用來(lái)支持系統(tǒng)完成相應(yīng)的操作。

    圖3 XKOJ主要數(shù)據(jù)表結(jié)構(gòu)系統(tǒng)重點(diǎn)視圖函數(shù)與數(shù)據(jù)庫(kù)表

    3.2 用戶功能分析

    用戶是在線測(cè)評(píng)系統(tǒng)一個(gè)重要的組成部分,系統(tǒng)需要具體實(shí)現(xiàn):注冊(cè)、登錄、填寫(xiě)、顯示和修改個(gè)人信息功能,并保證用戶提交題目或者比賽會(huì)產(chǎn)生相應(yīng)的練習(xí)數(shù)據(jù)與比賽數(shù)據(jù),并能進(jìn)行查詢。

    3.3 測(cè)評(píng)機(jī)功能分析

    一個(gè)在線測(cè)評(píng)系統(tǒng)需要驗(yàn)證用戶根據(jù)題目要求編寫(xiě)的代碼是否正確,即需要設(shè)計(jì)一個(gè)滿足評(píng)測(cè)需求的測(cè)評(píng)機(jī)。測(cè)評(píng)機(jī)需要識(shí)別語(yǔ)言和代碼信息,并編譯運(yùn)行程序,判斷程序是否符合要求,將結(jié)果數(shù)據(jù)打包返回。

    對(duì)于處理多用戶多提交解決方案代碼的實(shí)際情況,首先應(yīng)保證測(cè)評(píng)機(jī)能穩(wěn)定有序地返回評(píng)測(cè)結(jié)果,其次應(yīng)盡可能優(yōu)化測(cè)評(píng)機(jī)的評(píng)測(cè)水平以提高其性能。考慮到安全性,防止提交代碼內(nèi)包含惡意攻擊代碼,應(yīng)盡可能使用子進(jìn)程去驗(yàn)證并執(zhí)行子任務(wù)。

    圖4 測(cè)評(píng)機(jī)功能分析

    3.4 題庫(kù)功能分析

    題庫(kù)是在線測(cè)評(píng)系統(tǒng)的核心,有了階梯難度分布的廣泛題庫(kù),才能更好地鍛煉用戶的代碼水平[5]。

    解決問(wèn)題的代碼編寫(xiě)需要在限定的時(shí)間和空間復(fù)雜度內(nèi)考察用戶的算法能力,并對(duì)數(shù)據(jù)范圍有敏感的認(rèn)知。通過(guò)各表間的相互聯(lián)系,共同實(shí)現(xiàn)在線測(cè)評(píng)系統(tǒng)的一整套流程。

    3.5 博客功能分析

    博客是在線測(cè)評(píng)系統(tǒng)的重要組成部分,用戶可以通過(guò)編寫(xiě)博客的方式進(jìn)行輸出,分享解決問(wèn)題或積累的知識(shí),還可以通過(guò)博客內(nèi)的各類(lèi)知識(shí)與題解提高自己的學(xué)識(shí)。博客查閱需要舒適的閱讀體驗(yàn),可以通過(guò)封裝Markdown 提高內(nèi)容的可讀性。

    3.6 比賽功能分析

    比賽是一個(gè)封裝的功能,需要保證每場(chǎng)比賽之間的獨(dú)立性。同時(shí),在邏輯上,XKOJ 將題單作為沒(méi)有開(kāi)始與結(jié)束時(shí)間的比賽放在比賽頁(yè)面中。用戶點(diǎn)擊比賽時(shí),將跳轉(zhuǎn)到報(bào)名信息界面進(jìn)行報(bào)名。如果用戶未報(bào)名,則返回報(bào)名成功;如果已報(bào)名,則進(jìn)入具體比賽界面。通過(guò)不同表單之間的聯(lián)系,匹配用戶、題目、比賽三元組的信息,在比賽期間實(shí)時(shí)更新排名。在提交表中加入用戶提交本題的錯(cuò)誤次數(shù)、正確標(biāo)識(shí)和正確時(shí)間;在排名表中加入用戶的總通過(guò)數(shù)和總花費(fèi)時(shí)間,作為特征依據(jù)“通過(guò)數(shù)量多者優(yōu)先,通過(guò)數(shù)量相同者花費(fèi)時(shí)間小者優(yōu)先”的規(guī)則,對(duì)每位參加比賽的用戶進(jìn)行排序。

    對(duì)于提交狀態(tài),只需要在比賽內(nèi)的測(cè)評(píng)機(jī)內(nèi)不斷更新任務(wù)隊(duì)列中已處理的任務(wù)信息即可。同時(shí),根據(jù)自定義需求,在網(wǎng)頁(yè)上顯示部分特征。

    關(guān)于比賽題目查閱問(wèn)題,本系統(tǒng)采用通過(guò)超鏈接傳遞比賽ID 的方式,讓題目在提交時(shí)首先判斷是通過(guò)練習(xí)題單提交還是通過(guò)比賽提交,并調(diào)用不同的測(cè)評(píng)機(jī)進(jìn)行評(píng)測(cè)。這樣能夠很好地將提交信息封裝到每場(chǎng)不同的比賽中,保證數(shù)據(jù)清晰。

    4 測(cè)評(píng)系統(tǒng)測(cè)試及總結(jié)

    Celery是一種基于Python 的異步任務(wù)隊(duì)列消息代理,它提供了分布式任務(wù)調(diào)度和處理的功能。它可以與多種后端存儲(chǔ)集成,支持任務(wù)的異步執(zhí)行,可靠性高、可擴(kuò)展性強(qiáng)。

    測(cè)評(píng)環(huán)境為阿里云服務(wù)器2 核2 GB,測(cè)試內(nèi)容為使用Celery 作為任務(wù)隊(duì)列來(lái)實(shí)現(xiàn)一個(gè)測(cè)評(píng)機(jī)任務(wù)隊(duì)列,Redis 作為支持AMQP 的消息代理傳遞消息。通常情況下,Celery支持處理數(shù)以萬(wàn)計(jì)的任務(wù),但是任務(wù)隊(duì)列的吞吐量會(huì)受到消息代理的限制、任務(wù)處理時(shí)間的約束。

    本次測(cè)試通過(guò)程序編寫(xiě),模擬用戶提交解決方案,并發(fā)提交5000 個(gè)任務(wù)到任務(wù)隊(duì)列中,并記錄完成這些任務(wù)所需要的時(shí)間。為了測(cè)試測(cè)評(píng)機(jī)的吞吐量,測(cè)試了使用1 個(gè)測(cè)評(píng)機(jī)和4 個(gè)測(cè)評(píng)機(jī)的情況完成所有任務(wù)所需的時(shí)間,并計(jì)算出每秒可以測(cè)評(píng)的任務(wù)數(shù)量。

    進(jìn)行兩組測(cè)試,一組測(cè)試需要計(jì)算兩個(gè)數(shù)的和;另一組測(cè)試題目為圖論經(jīng)典題目最大流,需要在有向圖中找到一條從原點(diǎn)到匯點(diǎn)的路徑,使得路徑上的最小邊權(quán)最大。

    表1 測(cè)評(píng)機(jī)吞吐量測(cè)試

    經(jīng)過(guò)表格內(nèi)的測(cè)試結(jié)果,在任務(wù)量很大時(shí)測(cè)評(píng)機(jī)依舊可以保持不錯(cuò)的狀態(tài),使用4個(gè)測(cè)評(píng)機(jī)時(shí)效率大概為單測(cè)評(píng)機(jī)的四倍。這說(shuō)明,在處理較大的任務(wù)量時(shí),使用Celery 可以顯著提高任務(wù)處理的效率,減少任務(wù)完成的時(shí)間,提高系統(tǒng)的性能。因此,在本系統(tǒng)的使用需求下,采用Celery實(shí)現(xiàn)任務(wù)隊(duì)列是不錯(cuò)的選擇。

    5 結(jié)語(yǔ)

    近年來(lái),在線評(píng)測(cè)系統(tǒng)已經(jīng)被廣泛應(yīng)用于各個(gè)領(lǐng)域。隨著計(jì)算機(jī)科學(xué)技術(shù)的不斷發(fā)展,在線評(píng)測(cè)系統(tǒng)也在不斷進(jìn)步和完善。未來(lái),這些系統(tǒng)將引入更多的智能技術(shù),如機(jī)器學(xué)習(xí)和深度學(xué)習(xí),以提高評(píng)測(cè)的準(zhǔn)確性和效率[6]。同時(shí),為了保證比賽評(píng)判的公正性,將會(huì)為比賽參賽者提供更高效的代碼查重機(jī)制,并引入更加公正和客觀的評(píng)判機(jī)制。這些系統(tǒng)將根據(jù)不同用戶的需求和特點(diǎn),提供更加個(gè)性化的學(xué)習(xí)內(nèi)容和評(píng)測(cè)體驗(yàn)。未來(lái),在線評(píng)測(cè)系統(tǒng)將會(huì)不斷更新題庫(kù),覆蓋更多的算法和數(shù)據(jù)結(jié)構(gòu)等知識(shí),同時(shí)添加更多實(shí)際應(yīng)用場(chǎng)景下的編程題目,以幫助程序員更好地解決現(xiàn)實(shí)生活中遇到的問(wèn)題。

    此外,未來(lái)的在線評(píng)測(cè)系統(tǒng)將建立更加開(kāi)放的社區(qū)生態(tài),注重社區(qū)的建設(shè)和發(fā)展,為用戶提供更豐富的交流和互動(dòng)機(jī)會(huì),促進(jìn)用戶之間的交流和學(xué)習(xí)。同時(shí),這些系統(tǒng)將提供更加高效的測(cè)試和調(diào)試工具,幫助程序員更快地發(fā)現(xiàn)和解決程序中的問(wèn)題。它們還將為新出現(xiàn)的編程語(yǔ)言提供機(jī)會(huì)和平臺(tái),以便它們傳播、交流和發(fā)展。不僅如此,這些系統(tǒng)還將為不同需求的群體提供一個(gè)計(jì)算機(jī)科學(xué)技術(shù)交流的平臺(tái),促進(jìn)計(jì)算機(jī)科學(xué)技術(shù)的發(fā)展。

    猜你喜歡
    隊(duì)列視圖代碼
    隊(duì)列里的小秘密
    基于多隊(duì)列切換的SDN擁塞控制*
    軟件(2020年3期)2020-04-20 00:58:44
    在隊(duì)列里
    創(chuàng)世代碼
    創(chuàng)世代碼
    創(chuàng)世代碼
    創(chuàng)世代碼
    5.3 視圖與投影
    視圖
    豐田加速駛?cè)胱詣?dòng)駕駛隊(duì)列
    平远县| 贵南县| 长兴县| 南丰县| 满城县| 桃园市| 霞浦县| 三江| 桦川县| 紫金县| 屯昌县| 凌云县| 南和县| 柳江县| 陆丰市| 大庆市| 天门市| 淮北市| 高安市| 阳山县| 武穴市| 徐汇区| 嘉善县| 大竹县| 琼结县| 呈贡县| 康定县| 双柏县| 澄江县| 威远县| 四川省| 桂林市| 陇川县| 县级市| 新疆| 八宿县| 博白县| 临高县| 阳春市| 英山县| 莱西市|