1. 程式人生 > >python——非同步IO與事件驅動

python——非同步IO與事件驅動

協程

協程,又稱微執行緒,纖程。英文名Coroutine。一句話說明什麼是執行緒:協程是一種使用者態的輕量級執行緒

協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此:

協程能保留上一次呼叫時的狀態(即所有區域性狀態的一個特定組合),每次過程重入時,就相當於進入上一次呼叫的狀態,換種說法:進入上一次離開時所處邏輯流的位置。

協程的好處:

  • 無需執行緒上下文切換的開銷
  • 無需原子操作鎖定及同步的開銷
    •   "原子操作(atomic operation)是不需要synchronized",所謂原子操作是指不會被執行緒排程機制打斷的操作;這種操作一旦開始,就一直執行到結束,中間不會有任何 context switch (切換到另一個執行緒)。原子操作可以是一個步驟,也可以是多個操作步驟,但是其順序是不可以被打亂,或者切割掉只執行部分。視作整體是原子性的核心。
  • 方便切換控制流,簡化程式設計模型
  • 高併發+高擴充套件性+低成本:一個CPU支援上萬的協程都不是問題。所以很適合用於高併發處理。

缺點:

  • 無法利用多核資源:協程的本質是個單執行緒,它不能同時將 單個CPU 的多個核用上,協程需要和程序配合才能執行在多CPU上.當然我們日常所編寫的絕大部分應用都沒有這個必要,除非是cpu密集型應用。
  • 進行阻塞(Blocking)操作(如IO時)會阻塞掉整個程式

使用yield實現協程操作例子    

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 import time import queue def consumer(name): print("--->starting eating baozi...") while True: new_baozi = yield print("[%s] is eating baozi %s" % (name,new_baozi)) #time.sleep(1) def producer(): = con.__next__() = con2.__next__() = 0 while
 n < 5: +=1 con.send(n) con2.send(n) print("\033[32;1m[producer]\033[0m is making baozi %s" %n ) if __name__ == '__main__': con = consumer(

相關推薦

python——非同步IO事件驅動

協程 協程,又稱微執行緒,纖程。英文名Coroutine。一句話說明什麼是執行緒:協程是一種使用者態的輕量級執行緒。 協程擁有自己的暫存器上下文和棧。協程排程切換時,將暫存器上下文和棧儲存到其他地方,在切回來的時候,恢復先前儲存的暫存器上下文和棧。因此:

Nodejs的單執行緒、非同步IO事件驅動

Nodejs的最主要的特點就是單執行緒、非同步IO、事件驅動。 單執行緒: 單執行緒其實就是按從上到下順序依次來執行,而且每次只執行一個任務,只有當前這個任務執行完了,才會執行下一個任務。在JS引擎

非同步式I/O事件驅動--起步

Node.js使用的是單執行緒模型,對於所有I/O都採用非同步式的請求方式,避免了頻繁的上下文切換。Node.js在執行的過程中會維護一個事件佇列,程式在執行時進入事件迴圈等待下一個事件到來,每個非同步式I/O請求完成後會被推送到事件佇列,等待程式程序進行處理。

node.js非同步IO事件式程式設計

 Node.js最大的特性就是非同步式I/O與事件緊密結合的程式設計模式。這種模式與傳統的同步式IO線性的程式設計思路有很大的不同,因為控制流很大程度上要靠事件和回撥函式來組織,一個邏輯要拆分為若干個單元格。  內容:阻塞和執行緒         1.同步式I/O或阻塞式I

Python非同步IO:asyncio模組

協程 一個協程可以: result=await future 或者 result=yield from future——這兩句將會掛起協程,直到future完成後再返回future的執行結果,或者丟擲異常。 result=await coroutine 或者 resul

python】詳解事件驅動event實現

所有的計算機程式都可以大致分為兩類:指令碼型(單次執行)和連續執行型(直到使用者主動退出)。 指令碼型:指令碼型的程式包括最早的批處理檔案以及使用Python做交易策略回測等等,這類程式的特點是在使用者啟動後會按照程式設計時設計好的步驟一步步執行,所有步驟執行完後自動退出。

Netty非同步非阻塞事件驅動及元件原理詳解

本文基於 Netty 4.1 展開介紹相關理論模型,使用場景,基本元件、整體架構,知其然且知其所以然,希望給大家在實際開發實踐、學習開源專案方面提供參考。 Netty 是一個非同步事件驅動的網路應用程式框架,用於快速開發可維護的高效能協議伺服器和客戶端。 JDK 原生 NIO 程式的問題

python 非同步IOPython async/await 介紹

Python3.5增加了內建的async和await關鍵字。讓我們用幾個小例子來展示一下這兩個關鍵字如何使用。 如果你不明白什麼是“非同步程式設計”,你可以簡單地理解它為“在單個程序中同時處理多個任務的一種方法”。我們通常使用的程序經常花費大量的時間等待IO操

最大視角-從Unix底層 理解 pythonio模型、python非同步IOpython的select、Unix的select、epoll

參考連結 最基本的文章 python之路——IO模型 一步步理解python的非同步IO Unix底層文章 Linux-C網路程式設計之select函式 python 的 select linux select函式詳解 unix的select epoll簡介(一) unix的ep

c# Windows窗體事件驅動

建立Windows應用程式基本步驟 開啟Visual Studio軟體 新建專案 專案型別:Visual C#專案 模板:Windows 應用程式 熟悉開發環境 窗體的常用屬性 窗體的屬性非常多, 以下是常用的幾個。 Nam

訊息驅動事件驅動比較

簡單記錄自己對於 訊息驅動 和 事件驅動的理解。 關於這二者的具體區別,於實現上來說,二者都是 註冊繫結,然後交付執行。 訊息驅動模型在註冊的時候僅僅註冊一個回撥函式作為處理函式。 而事件驅動模型則需要註冊多個函式作為處理函式。 訊息驅動模型由於處理函式

Python非同步IO的未來(從Web後端開發的角度)

那麼Zeromq怎麼樣 首先,它不是那種多功能的軟體: 它很難拓展(hack on)(使用了複雜的C++ Actor模型) 嵌入進一些程式的效果欠佳(也就是說它沒有使用好fork) 對故障切換(failover)和服務發現(service discovery)整合欠佳 對非冪等(non-

非同步通訊事件分發框架

本文的潛在讀者是五年以下經驗的程式設計師,五年以上的資深工程師請繞道。 如果讀者有需求,本文回覆超過十個類似需求,我會整理一套開源的開發框架,含python/c++的socket伺服器端/客戶端程式碼,Java/oc的socket客戶端外加事件分發以及sample。這樣的框

非同步IO輕量級執行緒

執行緒通常用來執行平行計算,為大量阻塞操作增加併發度。 計算機執行計算任務時,通常還需要與各種IO裝置互動,這些裝置和CPU、記憶體比起來慢幾個數量級。大部分web應用的瓶頸都在於IO操作,如讀寫磁碟,網路操作,讀取資料庫。使用怎樣的策略等待這段時間,就成了改善效能的關鍵。

原始碼分析Dubbo非同步呼叫事件回撥機制

   本文將詳細分析Dubbo服務非同步呼叫與事件回撥機制。    1、非同步呼叫與事件回撥機制    1.1 非同步回撥    1.2 事件回撥    2、原始碼分析非同步呼叫與事件回撥機制    在Dubbo中,引入特定的過

python非同步IO程式設計(一)

python非同步IO程式設計(一) 基礎概念 協程:python  generator與coroutine 非同步IO (async IO):一種由多種語言實現的與語言無關的範例(或模型)。 asyncio:Python 3.4版本引入的標準庫,直接內建了對非同步IO的支援。  

python# 程序/執行緒/協程 # IO:同步/非同步/阻塞/非阻塞 # greenlet gevent # 事件驅動非同步IO # Select\Poll\Epoll非同步IO 以及selector

# 程序/執行緒/協程 # IO:同步/非同步/阻塞/非阻塞 # greenlet gevent # 事件驅動與非同步IO # Select\Poll\Epoll非同步IO 以及selectors模組 # Python佇列/RabbitMQ佇列   ###########

python事件驅動非同步I/O

通常,我們寫伺服器處理模型的時候,有以下幾種模型:每收到一個請求,建立一個新的程序,來處理該請求每收到一個請求,建立一個新的執行緒,來處理該請求每收到一個請求,放入一個時間列表,讓主程序通過非阻塞I/O方式來處理請求以上幾種方式各有優缺點:第一種方法中,由於建立新的程序開銷比

事件驅動多路IO復用

監聽 sea [] env tar 才有 可能 exception tput 通常,我們寫服務器處理模型的程序時,有以下幾種模型: (1)每收到一個請求,創建一個新的進程,來處理該請求; (2)每收到一個請求,創建一個新的線程,來處理該請求; (3)每收到一個請求,放入一

事件驅動異步IO

網絡服務 pan 切換 ccf 服務器模型 實現 安全 創建 普通 通常我們寫服務器模型,有以下幾種模型: 每收到一個請求,創建一個新的進程,來處理該請求 每收到一個請求,創建一個新的線程,來處理該請求 每收到一個請求,放入到一個事件中,讓主程序通過非阻塞I/0方式來處