Python學習之asyncore模組用法例項教程

2022-10-04 23:51:21 字數 2405 閱讀 3644

asyncore庫是python的乙個標準庫,它是乙個非同步socket的包裝。我們操作網路的時候可以直接使用socket等底層的庫,但是asyncore使得我們可以更加方便的操作網路,避免直接使用socket,select,poll等工具時需要面對的複雜。

這個庫很簡單,包含了乙個函式和乙個類

* loop()函式

* dispatcher基類

需要注意的是,loop函式是全域性的,不是dispatcher的方法

每乙個從dispatcher繼承的類的物件,都可以看作我們需要處理的乙個socket,可以是tcp連線或者udp,甚至是其它不常用的。使用容易,我們需要定義乙個類,它繼承程式設計客棧dispatcher,然後我們重寫(覆蓋)一些方法就可以了。

我們需要重寫的方法一般都以handle_打頭。

class refuse(dispatcher):

def handle_accept():

#do notwww.cppcns.comhing ...

pass

loop()函式負責檢測乙個dict,dict中儲存dispatcher的例項,這個字典被稱為channel。每次建立乙個dispatcher物件,都會把自己加入到乙個預設的dict裡面去(當然也可以自己指定channel)。當物件被加入到channel中的時候,socket的行為都已經被定義好,程式只需要呼叫loop(),一切功能就實現了。

asyncore是python標準庫中的乙個良好的設計

在python的標準文件中,有乙個asyncore的例子

執行這個函式,發現pyt程式設計客棧hon.org的首頁被**下來了,也就是說我們實現了乙個http層的協議?但是我們用的僅僅是socket級別的api…那麼來看看這幾行**的奧妙吧!

writable和readable在檢測到乙個socket可以寫入或者檢測到資料到達的時候,被呼叫,並返回乙個bool來決定是否handle_read或者handle_write

開啟asyncore.py可以看到,dispatcher類中定義的方法writable和readable的定義相當的簡單:

def readable(self):

return true

def writable(self):

return true

就是說,一旦檢測到可讀或可寫,就直接呼叫handle_read/handle_write,但是在上面的例子中,我們卻看到了乙個過載(看上去像c++的虛函式,不是嗎?)

def writable(self):

return (len(self.buffer) > 0)

很明顯,當我們有資料需要傳送的時候,我們才給writable的呼叫者返回乙個true,這樣就不需要在handle_write中再做判斷了,邏輯很明確,**很清晰,美程式設計客棧中不足的是理解需要一點時間,但是不算困難吧!

其餘的**看起來就很清晰了,有一種兵來將擋的感覺。當乙個http伺服器傳送處理完成你的請求,close socket的時候,我們的handle_close()也相應完成自己的使命。close()將物件自身從channel中刪除,並且負責銷毀socket物件。

def close(self):

self.del_channel()

self.socket.close()

loop()函式檢測到乙個空的channel,將退出迴圈,程式完成任務,exit。

本文標題: python學習之asyncore模組用法例項教程

本文位址:

python學習詳解 Python學習之字典詳解

在元組和列表中,都是通過編號進行元素的訪問,但有的時候我們按名字進行資料甚至資料結構的訪問,在c 中有map的概念,也就是對映,在python中也提供了內建的對映型別 字典。對映其實就是一組key和value以及之間的對映函式,其特點是 key的唯一性 key與value的一對多的對映。1.字典的建...

Python學習之函式

0 引論 函式是實現 復用的主要途徑之一,而且函式的使用也可以使得程式更加容易理解,更加規範化。程式很多時候並不是給計算機的,而是給人看的。這裡總結一下python中的函式的應用 1 函式 首先python中的函式的格式是怎樣的。def 函式名 形參 函式體 下面是乙個計算fibonacci數列的函...

python學習之函式

抽象 斐波那契數列 fibs 0,1 for i in range 10 print fibs fibs 0,1 i 2 while i 20 i 1 print fibs 使用callable判斷函式是否可以呼叫 import math x 1 y math.sqrt print callable...