<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                [構建工具-setup.py](構建工具-setup.py.md) [TOC] ## 1. 事件驅動 通常,我們寫服務器處理模型的程序時,有以下幾種模型: > 1. 每收到一個請求,創建一個新的進程,來處理該請求; > 2. 每收到一個請求,創建一個新的線程,來處理該請求; > 3. 每收到一個請求,放入一個事件列表,讓主進程通過非阻塞I/O方式來處理請求 幾種方式,各有千秋 > 第1中方法,由于創建新的進程的開銷比較大,所以,會導致服務器性能比較差,但實現比較簡單。 > 第2種方式,由于要涉及到線程的同步,有可能會面臨死鎖等問題。 > 第3種方式,在寫應用程序代碼時,邏輯比前面兩種都復雜。 綜合考慮各方面因素,一般普遍認為第(3)種方式是大多數網絡服務器采用的方式 事件驅動編程是一種編程范式,這里程序的執行流由外部事件來決定(觸發)。單線程中所有動作由相應的事件觸發。 **1. 異步程序背后的最主要的特點就在于,當出現一個任務像在同步程序一樣出現阻塞時,會讓其它可以執行的任務繼續執行,而 不會像同步程序中那樣全部阻塞掉。因此一個異步程序只有在沒有任務可執行時才會出現“阻塞”,這也是為什么異步程序被稱為非阻塞程序的原因。** **2. 任務之間的切換要不是此任務完成,要不就是它被阻塞。由于大量任務可能會被阻塞,異步程序等待的時間少于同步程序而將這些時間用于其它實時工作的處理(如與人打交道的接口),這樣一來,前者的性能必然要高很多。** 事件驅動編程是一種編程范式,這里程序的執行流由外部事件來決定。它的特點是包含一個事件循環,當外部事件發生時使用回調機制來觸發相應的處理。另外兩種常見的編程范式是(單線程)同步以及多線程編程。 讓我們用例子來比較和對比一下單線程、多線程以及事件驅動編程模型。下圖展示了隨著時間的推移,這三種模式下程序所做的工作。這個程序有3個任務需要完成,每個任務都在等待I/O操作時阻塞自身。阻塞在I/O操作上所花費的時間已經用灰色框標示出來了。 ![](https://box.kancloud.cn/91a019765fb74250aab13abbf5f09f42_1162x1108.png) 注:空白表示程序處于等待(CPU) > 1. 在單線程同步模型中,任務按照順序執行。如果某個任務因為I/O而阻塞,其他所有的任務都必須等待,直到它完成之后它們才能依次執行。這種明確的執行順序和串行化處理的行為是很容易推斷得出的。如果任務之間并沒有互相依賴的關系,但仍然需要互相等待的話這就使得程序不必要的降低了運行速度。 > 2. 在多線程版本中,這3個任務分別在獨立的線程中執行。這些線程由操作系統來管理,在多處理器系統上可以并行處理,或者在單處理器系統上交錯執行。這使得當某個線程阻塞在某個資源的同時其他線程得以繼續執行。與完成類似功能的同步程序相比,這種方式更有效率,但程序員必須寫代碼來保護共享資源,防止其被多個線程同時訪問。多線程程序更加難以推斷,因為這類程序不得不通過線程同步機制如鎖、可重入函數、線程局部存儲或者其他機制來處理線程安全問題,如果實現不當就會導致出現微妙且令人痛不欲生的bug。 > 3. 在事件驅動版本的程序中,3個任務交錯執行,但仍然在一個單獨的線程控制中。當處理I/O或者其他昂貴的操作時,注冊一個回調到事件循環中,然后當I/O操作完成時繼續執行。回調描述了該如何處理某個事件。事件循環輪詢所有的事件,當事件到來時將它們分配給等待處理事件的回調函數。這種方式讓程序盡可能的得以執行而不需要用到額外的線程。事件驅動型程序比多線程程序更容易推斷出行為,因為程序員不需要關心線程安全問題。 當我們面對如下的環境時,事件驅動模型通常是一個好的選擇: 1. 程序中有許多任務,而且… 2. 任務之間高度獨立(因此它們不需要互相通信,或者等待彼此)而且… 3. 在等待事件到來時,某些任務會阻塞。 當應用程序需要在任務間共享可變的數據時,這也是一個不錯的選擇,因為這里不需要采用同步處理。 網絡應用程序通常都有上述這些特點,這使得它們能夠很好的契合事件驅動編程模型。 ## 2. what's the Twisted? > Twisted是用Python實現的基于事件驅動的異步網絡引擎框架。基于Twisted使用和開發完全異步的網絡應用程序和協議. > wisted誕生于2000年初,在當時的網絡游戲開發者看來,無論他們使用哪種語言,手中都鮮有可兼顧擴展性及跨平臺的網絡庫。Twisted的作者試圖在當時現有的環境下開發游戲,這一步走的非常艱難,他們迫切地需要一個可擴展性高、基于事件驅動、跨平臺的網絡開發框架,為此他們決定自己實現一個,并從那些之前的游戲和網絡應用程序的開發者中學習,汲取他們的經驗教訓。 > Twisted支持許多常見的傳輸及應用層協議,包括TCP、UDP、SSL/TLS、HTTP、IMAP、SSH、IRC以及FTP。就像Python一樣,Twisted也具有“內置電池”(batteries-included)的特點。Twisted對于其支持的所有協議都帶有客戶端和服務器實現,同時附帶有基于命令行的工具,使得配置和部署產品級的Twisted應用變得非常方便。 > 1. twisted是實現了Reactor模式的 > 2. 在一個回調函數執行過程中,實際上Twisted的循環是被有效地阻塞在我們的代碼上的。因此,因此我們應該確保回調函數不要浪費時間(盡快返回)。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看