PC + 手機 + 微信網站 + 小程序 + APP,五端合一(yī / yì /yí)
我們已經知道(dào)了(le/liǎo)同步的(de)基本定義和(hé / huò)一(yī / yì /yí)些示例,那麽讓我們拓寬一(yī / yì /yí)-下讨論,看看應用中的(de)同步調用和(hé / huò)異步調用。同步調用是(shì)在(zài)調用返回時(shí)才能完全執行它們的(de)動作。如果一(yī / yì /yí)個(gè)方法被調用了(le/liǎo),控制權被轉給該方法來(lái)行使,那麽隻有當該方法完成了(le/liǎo)自己要(yào / yāo)執行的(de)操作,成功地(dì / de)返回了(le/liǎo)或者返回有錯時(shí),應用中調用該方法的(de)地(dì / de)方才會重新得到(dào)控制權。換而(ér)言之(zhī),同步方法先被調用,然後它們執行操作,當它們完成時(shí),會返還控制權。
作爲(wéi / wèi)同步方法的(de)一(yī / yì /yí)個(gè)示例,讓我們來(lái)看看AllScale公司的(de)HRM服務中的(de)一(yī / yì /yí)個(gè)方法query_ exec。該方法用于(yú)構建和(hé / huò)執行一(yī / yì /yí)個(gè)動态的(de)數據庫查詢。query_ exec方法中的(de)一(yī / yì /yí)個(gè)步驟是(shì)建立一(yī / yì /yí)一(yī / yì /yí)個(gè)數據庫連接。在(zài)得到(dào)這(zhè)個(gè)數據庫連接任務成功完成了(le/liǎo)的(de)明确确認之(zhī)前,query. exec方法不(bù)會繼續執行。這(zhè)樣做既浪費資源,又浪費時(shí)間。如果數據庫不(bù)可用,那麽該應用就(jiù)不(bù)應該把時(shí)間浪費在(zài)創建查詢、等待數據庫恢複可用上(shàng)。事實上(shàng),如果數據庫不(bù)可用了(le/liǎo),,看看如何劃分數據庫來(lái)提高它的(de)可用性。盡管如此,這(zhè)是(shì)個(gè)說(shuō)明同步調用是(shì) 如何工作的(de)例子(zǐ)。因此,發起調用的(de)方法會被暫停,直到(dào)被調用的(de)進程返回結果之(zhī)前,它是(shì)不(bù)能完成的(de)。
另一(yī / yì /yí)個(gè)說(shuō)明同步性的(de)非技術示例是(shì)兩個(gè)人(rén)之(zhī)間的(de)溝通,這(zhè)可以(yǐ)是(shì)面對面,也(yě)可以(yǐ)是(shì)通過電話。如果這(zhè)兩個(gè)人(rén)都忙于(yú)有意義的(de)談話,那麽就(jiù)不(bù)太可能發生其他(tā)的(de)動作。其中一(yī / yì /yí)人(rén)如果不(bù)停止與另一(yī / yì /yí)人(rén)的(de)談話,那麽很難再與第三個(gè)人(rén)開始交談。電話會直占線,直到(dào)兩個(gè)人(rén)中的(de)一(yī / yì /yí)個(gè)或者兩者挂斷了(le/liǎo)電話。
與同步方法或進程相對的(de)是(shì)異步方法。在(zài)異步方法調用中,會在(zài)一(yī / yì /yí)個(gè)新的(de)線程中調用一(yī / yì /yí)個(gè)方法,這(zhè)個(gè)方法會立即把控制權返回給調用它的(de)線程。描述異步方法調用的(de)設計模式叫作異步設計或異步方法調用(AMI)。這(zhè)個(gè)異步調用的(de)方法會在(zài)另一(yī / yì /yí)個(gè)線程中繼續執行,或成功結束或出(chū)現錯誤,但都不(bù)會再與發起它的(de)線程有進一(yī / yì /yí)步的(de)交互。 讓我們再來(lái)看看AllScale公司的(de)query exec方法。在(zài)調用了(le/liǎo)同步方法,建立數據庫連接後,該方法需要(yào / yāo)準備和(hé / huò)執行查詢了(le/liǎo)。在(zài)HRM系統中,AllScale公司有一(yī / yì /yí)個(gè)監控框架,能夠用來(lái)觀察所有查詢的(de)持續時(shí)間以(yǐ)及查詢是(shì)否成功了(le/liǎo),這(zhè)個(gè)框架采用了(le/liǎo)異步調用方法start query_ time和(hé / huò)end query time。這(zhè)些方法會把一(yī / yì /yí)個(gè)系統時(shí)間存儲在(zài)内存中,等待調用的(de)結束,以(yǐ)便計算查詢的(de)持續時(shí)間。然後這(zhè)個(gè)持續時(shí)間會被存儲在(zài)一(yī / yì /yí)個(gè)監控數據
庫中,通過查詢這(zhè)個(gè)數據庫,可以(yǐ)根據查詢運行時(shí)間的(de)長短了(le/liǎo)解系統運行狀況如何。雖然監控查詢的(de)性能很重要(yào / yāo),但讓查詢真正服務于(yú)用戶的(de)請求更爲(wéi / wèi)重要(yào / yāo)。因此,start query time和(hé / huò)lend query_time這(zhè)些方法是(shì)以(yǐ)異步模式調用的(de)。如果它們運行成功并返回了(le/liǎo)結果,那麽AllScale公司的(de)運營團隊和(hé / huò)軟件開發團隊就(jiù)能從監控數據庫中得到(dào)查詢時(shí)間。即使監控調用失敗了(le/liǎo),或者連接監控數據庫花了(le/liǎo)20秒的(de)時(shí)間,這(zhè)些團隊都不(bù)會在(zài)乎。用戶的(de)查詢仍然在(zài)運行,它們根本不(bù)關心這(zhè)些異步調用。
回到(dào)我們人(rén)際溝通的(de)示例,電子(zǐ)郵件是(shì)個(gè)異步通信的(de)很好例子(zǐ)。你寫了(le/liǎo)電子(zǐ)郵件并把它發出(chū)去後,可以(yǐ)立即去做其他(tā)的(de)事情,可以(yǐ)寫另一(yī / yì /yí)封郵件, 也(yě)可以(yǐ)打一(yī / yì /yí)輪高爾夫球或者其他(tā)什麽事情。當回複的(de)郵件在(zài)一(yī / yì /yí)個(gè)合适的(de)時(shí)候到(dào)達時(shí),你可以(yǐ)閱讀這(zhè)封回複的(de)郵件,并可能發出(chū)另一(yī / yì /yí)封郵件,作爲(wéi / wèi)回複。這(zhè)個(gè)網站設計的(de)溝通鏈除了(le/liǎo)需要(yào / yāo)爲(wéi / wèi)處理溝通和(hé / huò)寫回信花費點時(shí)間之(zhī)外,不(bù)會妨礙發送者和(hé / huò)接收者的(de)任何其他(tā)活動。
上(shàng)一(yī / yì /yí)篇:網頁制作
下一(yī / yì /yí)篇:中小型企業建網站中的(de)常見問題