熱更新方法及裝置的制造方法
【技術(shù)領(lǐng)域】
[0001 ]本發(fā)明涉及計(jì)算機(jī)技術(shù)領(lǐng)域,尤其涉及一種熱更新方法及裝置。
【背景技術(shù)】
[0002] 在互聯(lián)網(wǎng)領(lǐng)域,常常需要在服務(wù)端對(duì)已經(jīng)發(fā)布出去的客戶(hù)端中出現(xiàn)問(wèn)題的模塊進(jìn) 行緊急修復(fù)更新,以保證系統(tǒng)的穩(wěn)定性以及用戶(hù)體驗(yàn)。
[0003] 在現(xiàn)有技術(shù)中,熱更新通常采用reload方法來(lái)對(duì)存在問(wèn)題的模塊進(jìn)行重新加載。 具體的,開(kāi)發(fā)人員對(duì)存在問(wèn)題的腳本模塊進(jìn)行更新,測(cè)試通過(guò)后將更新后的腳本模塊推送 給客戶(hù)端??蛻?hù)端接收到更新好的腳本模塊后,對(duì)腳本模塊進(jìn)行即時(shí)編譯,之后使用reload 將對(duì)應(yīng)的模塊進(jìn)行重載,重載過(guò)后程序在運(yùn)行時(shí)調(diào)用新模塊,并通過(guò)所述新模塊生成新的 對(duì)象。
[0004] 但是,如果舊模塊已經(jīng)被加載過(guò)進(jìn)內(nèi)存,舊模塊所創(chuàng)建舊的對(duì)象仍然指向舊模塊, 使得舊的對(duì)象沒(méi)有得到更新。這種情況下需要?jiǎng)t需要遍歷所有加載過(guò)舊模塊的對(duì)象,將其 中錯(cuò)誤的函數(shù)和變量逐一替換成新的函數(shù)和變量。
[0005] 例如,現(xiàn)在存在一個(gè)human的模塊,其中定義了 一個(gè)Person類(lèi),Person類(lèi)中存在一 個(gè)方法is_young用于判斷某個(gè)Person是否為年輕的。
[0006]
[0007] 上線(xiàn)后,測(cè)試人員發(fā)現(xiàn)正確的做法應(yīng)該是年齡(self.age)小于40的才是年輕的。 現(xiàn)有技術(shù)中,開(kāi)發(fā)人員會(huì)修訂這個(gè)錯(cuò)誤,然后將新的human模塊發(fā)送給客戶(hù)端,客戶(hù)端接收 代碼后,客戶(hù)端接收代碼后,覆蓋本地的human代碼內(nèi)容,然后執(zhí)行reload (human)重新加載 human模塊,此后新生成的Person對(duì)象中判斷一個(gè)人是否年輕的方法被更新了。
[0008] 然而,re load只解決了加載新代碼的問(wèn)題,而程序中已經(jīng)被創(chuàng)建出來(lái)的舊的 Person對(duì)象并沒(méi)有因此而發(fā)生任何改變,舊的Person對(duì)象中判斷一個(gè)人是否年輕的方法依 然是錯(cuò)誤的。因此,為了將問(wèn)題徹底更新,那么還需要遍歷所有現(xiàn)有Person對(duì)象的對(duì)象來(lái)刷 新其中的方法以及變量,這是相當(dāng)棘手以及耗時(shí)的。
[0009] 同時(shí),由于需要推送所有出現(xiàn)了問(wèn)題的Python腳本,那么當(dāng)問(wèn)題分布在多個(gè)模塊 中或者所在模塊代碼量較大時(shí),需要用戶(hù)消耗較多的流量獲取更新腳本。
[0010]此外,采用reload的方法進(jìn)行熱更新對(duì)開(kāi)發(fā)人員來(lái)說(shuō)有很多限制。例如,為了為了 簡(jiǎn)化reload的復(fù)雜度,通常需要約束開(kāi)發(fā)人員不能使用from…import模塊的寫(xiě)法。
【發(fā)明內(nèi)容】
[0011] 本發(fā)明實(shí)施例提出一種熱更新方法及裝置,能簡(jiǎn)化客戶(hù)端熱更新的過(guò)程,減少熱 更新所需的流量,并且減少對(duì)開(kāi)發(fā)人員編寫(xiě)熱更新代碼時(shí)受到的限制。
[0012] 本發(fā)明一方面提供一種熱更新方法,包括:
[0013] 檢測(cè)當(dāng)前運(yùn)行中的程序是否需要進(jìn)行熱更新;
[0014]當(dāng)確定所述程序需要進(jìn)行熱更新時(shí),從服務(wù)器中獲取熱更新執(zhí)行代碼;所述熱更 新執(zhí)行代碼包括標(biāo)識(shí)信息與更新內(nèi)容代碼;所述標(biāo)識(shí)信息用于標(biāo)識(shí)所述程序的模塊中需要 被更新的變量或函數(shù);每個(gè)所述的變量或函數(shù)在內(nèi)存中存儲(chǔ)了對(duì)應(yīng)的本地內(nèi)容代碼;所述 更新內(nèi)容代碼用于替換需要被更新的變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼;
[0015] 運(yùn)行所述熱更新執(zhí)行代碼,根據(jù)所述標(biāo)識(shí)信息查找需要被更新的變量或函數(shù),并 將所述更新內(nèi)容代碼替換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼,以更新所述變量或函 數(shù)的內(nèi)容;
[0016] 當(dāng)通過(guò)所述模塊創(chuàng)建的對(duì)象調(diào)用所述變量或函數(shù)時(shí),以所述更新內(nèi)容代碼作為所 述變量或函數(shù)的內(nèi)容運(yùn)行。
[0017] 作為更優(yōu)選地,所述當(dāng)通過(guò)所述模塊創(chuàng)建的對(duì)象調(diào)用所述變量或函數(shù)時(shí),以所述 更新內(nèi)容代碼作為所述變量或函數(shù)的內(nèi)容運(yùn)行,具體包括:
[0018] 當(dāng)通過(guò)所述模塊創(chuàng)建的對(duì)象調(diào)用所述變量或函數(shù)時(shí),檢查所述變量或函數(shù)的內(nèi)容 相對(duì)于所述對(duì)象是否有新增的變量;
[0019] 當(dāng)有新增的變量時(shí),對(duì)所述新增的變量初始化賦值,并以所述更新內(nèi)容代碼作為 所述變量或函數(shù)的內(nèi)容運(yùn)行;
[0020] 當(dāng)沒(méi)有新增的變量時(shí),直接以所述更新內(nèi)容代碼作為所述變量或函數(shù)的內(nèi)容運(yùn) 行。
[0021] 作為更優(yōu)選地,所述檢測(cè)運(yùn)行中的程序是否需要進(jìn)行熱更新,具體包括:
[0022] 獲取所述服務(wù)器發(fā)送的關(guān)于當(dāng)前運(yùn)行中的程序的熱更新推送消息;所述熱更新推 送消息包括第一哈希信息;所述第一哈希信息為存儲(chǔ)在所述服務(wù)器的熱更新執(zhí)行代碼的哈 希信息;
[0023] 判斷所述第一哈希信息與第二哈希信息是否一致;所述第二哈希信息為存儲(chǔ)在本 地的熱更新執(zhí)行代碼的哈希信息;
[0024] 若所述第一哈希信息與所述第二哈希信息一致,則確定所述程序不需要進(jìn)行更 新;
[0025] 若所述第一哈希信息與所述第二哈希信息不一致,則確定所述程序需要進(jìn)行更 新;
[0026] 在所述運(yùn)行所述熱更新執(zhí)行代碼,根據(jù)所述標(biāo)識(shí)信息查找需要被更新的變量或函 數(shù),并將所述更新內(nèi)容代碼替換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼,以更新所述變 量或函數(shù)的內(nèi)容之后,還包括:
[0027] 存儲(chǔ)所述第一哈希信息,并將所述第一哈希信息覆蓋所述第二哈希信息。
[0028] 作為更優(yōu)選地,所述運(yùn)行所述熱更新執(zhí)行代碼,根據(jù)所述標(biāo)識(shí)信息查找需要被更 新的變量或函數(shù),并將所述更新內(nèi)容代碼替換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼, 以更新所述變量或函數(shù)的內(nèi)容,具體包括:
[0029] 計(jì)算獲取到的熱更新執(zhí)行代碼的哈希信息;
[0030] 判斷獲取到的熱更新執(zhí)行代碼的哈希信息與所述第一哈希信息是否一致;
[0031] 若獲取到的熱更新執(zhí)行代碼的哈希信息與所述第一哈希信息一致,運(yùn)行所述熱更 新執(zhí)行代碼,根據(jù)所述標(biāo)識(shí)信息查找需要被更新的變量或函數(shù),并將所述更新內(nèi)容代碼替 換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代碼,以更新所述變量或函數(shù)的內(nèi)容。
[0032] 作為更優(yōu)選地,所述熱更新方法還包括:
[0033] 若獲取到的熱更新執(zhí)行代碼的哈希信息與所述第一哈希信息不一致,則重新從服 務(wù)器獲取用于對(duì)所述程序熱更新的熱更新執(zhí)行代碼。
[0034] 作為更優(yōu)選地,所述哈希信息為對(duì)應(yīng)的熱更新執(zhí)行代碼的MD5值。
[0035] 本發(fā)明另一方面提供一種熱更新裝置,包括:
[0036] 熱更新檢測(cè)模塊,用于檢測(cè)當(dāng)前運(yùn)行中的程序是否需要進(jìn)行熱更新;
[0037] 執(zhí)行代碼獲取模塊,用于當(dāng)確定所述程序需要進(jìn)行熱更新時(shí),從服務(wù)器中獲取熱 更新執(zhí)行代碼;所述熱更新執(zhí)行代碼包括標(biāo)識(shí)信息與更新內(nèi)容代碼;所述標(biāo)識(shí)信息用于標(biāo) 識(shí)所述程序的模塊中需要被更新的變量或函數(shù);每個(gè)所述的變量或函數(shù)在內(nèi)存中存儲(chǔ)了對(duì) 應(yīng)的本地內(nèi)容代碼;所述更新內(nèi)容代碼用于替換需要被更新的變量或函數(shù)在內(nèi)存中的本地 內(nèi)容代碼;
[0038] 執(zhí)行代碼運(yùn)行模塊,用于運(yùn)行所述熱更新執(zhí)行代碼,根據(jù)所述標(biāo)識(shí)信息查找需要 被更新的變量或函數(shù),并將所述更新內(nèi)容代碼替換所述變量或函數(shù)在內(nèi)存中的本地內(nèi)容代 碼,以更新所述變量或函數(shù)的內(nèi)容;
[0039] 對(duì)象運(yùn)行模塊,用于當(dāng)通過(guò)所述模塊創(chuàng)建的對(duì)象調(diào)用所述變量或函數(shù)時(shí),以所述 更新內(nèi)容代碼作為所述變量或函數(shù)的內(nèi)容運(yùn)行。
[0040] 作為更優(yōu)選地,所述對(duì)象運(yùn)行模塊具體包括:
[0041] 變量檢查單元,用于當(dāng)通過(guò)所述模塊創(chuàng)建的對(duì)象調(diào)用所述變量或函數(shù)時(shí),檢查所 述變量或函數(shù)的內(nèi)容相對(duì)于所述對(duì)象是否有新增的變量;
[0042] 第一運(yùn)行單元,用于當(dāng)有新增的變量時(shí),對(duì)所述新增的變量初始化賦值,并以所述 更新內(nèi)容代碼作為所述變量或函數(shù)的內(nèi)容運(yùn)行;
[0043] 第二運(yùn)行單元,用于當(dāng)沒(méi)有新增的變量時(shí),直接以所述更新內(nèi)容代碼作為所述變 量或函數(shù)的內(nèi)容運(yùn)行。
[0044] 作為更優(yōu)選地,所述熱更新檢測(cè)模塊具體包括:
[0045] 推送消息獲取單元,用于獲取所述服務(wù)器發(fā)送的關(guān)于當(dāng)前運(yùn)行中的程序的熱更新 推送消息;所述熱更新推送消息包括第一哈希信息;所述第一哈希信息為存儲(chǔ)在所述服務(wù) 器的熱更新執(zhí)行代碼的哈希信息;
[0046] 第一判斷單元,用于判斷所述第一哈希信息與第二哈希信息是否一致;所述第二 哈