python非同步socket
1. python中兩種網路編程方式:Socket和HTTP協議
在Python網路編程領域,Socket和HTTP協議是兩大核心手段。本文將深入探討這兩種方式,帶你從實際應用角度理解它們。
首先,Socket編程作為基礎,是實現網路通信的核心模塊。Python的socket模塊讓Socket編程變得直觀易用。通過示例,你能構建一個簡單的Socket伺服器,客戶端可以連接並接收消息,適用於即時通訊和文件傳輸等場景。
接著,HTTP協議更偏向於應用層,是超媒體文檔傳輸的常用協議。Python的requests庫簡化了HTTP通信,例如GET和POST請求的發送與響應處理。在Web開發和API交互中,HTTP協議的應用更為廣泛。
在實際應用中,Socket編程可利用多線程處理多個客戶端請求,提高並發性能。Python的threading模塊支持多線程,便於高效地同時處理多個連接請求。
總的來說,Python通過Socket和HTTP協議提供了豐富的網路編程手段。Socket適合定製化通信,HTTP則方便與Web服務交互。理解並掌握這兩種技術,對於開發網路應用至關重要。通過本文,你將對這兩種網路編程方式有更深的理解和實踐能力。
2. python gevent 每個socket 的消息接收是否有使用事件監聽回調的方法
gevent 比起其他框架(比如tornado,twisted)的一個巨大優勢就是:用同步的方法(自然沒有回調函數)寫非同步應用,因為同步的方式更接近開發人員的編程思維。
gevent可以用一句話向pythoner闡述:使用多路IO復用對文件描述符的事件監聽,從而撬動協程的「透明」切換。這句話說起來容易,但是闡述起來就復雜些:
底層(或者說主協程)自然有一個多路IO復用循環(linux上是epoll,unix是kqueue,以下統一用epoll代替描述)
當處理一個socket鏈接時,就創建一個協程greenlet去處理。
當socket遇到阻塞的時候,比如等待數據的返回或者發送,此時gevent做了很關鍵的兩步:
為這個socket的fd在epoll上添加可讀或者可寫事件回調,而這個回調函數便是 gevent.getcurrent().switch
通過 get_hub().switch() 切換到主協程。切換回主協程,去干其他事情了。但是當該socket可讀或者可寫,epoll自然會調用上述添加的回調函數,從而切換回socket的處理協程,從上次懸掛點接著往下執行。
之所以做到透明,是因為python socket上打了patch。所謂打patch,就是自己實現了一個socket模塊替換了python的標准socket模塊。