新聞中心
asyncore —- 異步套接字處理器
源碼: Lib/asyncore.py

10年積累的做網(wǎng)站、成都做網(wǎng)站經(jīng)驗(yàn),可以快速應(yīng)對(duì)客戶對(duì)網(wǎng)站的新想法和需求。提供各種問題對(duì)應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識(shí)你,你也不認(rèn)識(shí)我。但先網(wǎng)站設(shè)計(jì)后付款的網(wǎng)站建設(shè)流程,更有霍林郭勒免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。
從版本 3.6 開始標(biāo)記為過時(shí),將在版本 3.12 中移除。: The asyncore module is deprecated (see PEP 594 for details). Please use asyncio instead.
備注
該模塊僅為提供向后兼容。我們推薦在新代碼中使用 asyncio 。
該模塊提供用于編寫異步套接字服務(wù)客戶端與服務(wù)端的基礎(chǔ)構(gòu)件。
Availability: not Emscripten, not WASI.
This module does not work or is not available on WebAssembly platforms wasm32-emscripten and wasm32-wasi. See WebAssembly platforms for more information.
只有兩種方法讓單個(gè)處理器上的程序“同一時(shí)間完成不止一件事”。 多線程編程是最簡單和最流行的方法,但是還有另一種非常不同的技術(shù),它可以讓你擁有多線程的幾乎所有優(yōu)點(diǎn),而無需實(shí)際使用多線程。 它僅僅在你的程序主要受 I/O 限制時(shí)有用,那么。 如果你的程序受處理器限制,那么先發(fā)制人的預(yù)定線程可能就是你真正需要的。 但是,網(wǎng)絡(luò)服務(wù)器很少受處理器限制。
如果你的操作系統(tǒng)在其 I/O 庫中支持 select() 系統(tǒng)調(diào)用(幾乎所有操作系統(tǒng)),那么你可以使用它來同時(shí)處理多個(gè)通信通道;在 I/O 正在“后臺(tái)”時(shí)進(jìn)行其他工作。 雖然這種策略看起來很奇怪和復(fù)雜,特別是起初,它在很多方面比多線程編程更容易理解和控制。 asyncore 模塊為您解決了許多難題,使得構(gòu)建復(fù)雜的高性能網(wǎng)絡(luò)服務(wù)器和客戶端的任務(wù)變得輕而易舉。 對(duì)于“會(huì)話”應(yīng)用程序和協(xié)議,伴侶 asynchat 模塊是非常寶貴的。
這兩個(gè)模塊背后的基本思想是創(chuàng)建一個(gè)或多個(gè)網(wǎng)絡(luò) 通道 ,類的實(shí)例 asyncore.dispatcher 和 asynchat.async_chat 。 創(chuàng)建通道會(huì)將它們添加到全局映射中,如果你不為它提供自己的 映射 ,則由 loop() 函數(shù)使用。
一旦創(chuàng)建了初始通道,調(diào)用 loop() 函數(shù)將激活通道服務(wù),該服務(wù)將一直持續(xù)到最后一個(gè)通道(包括在異步服務(wù)期間已添加到映射中的任何通道)關(guān)閉。
asyncore.loop([timeout[, use_poll[, map[, count]]]])
進(jìn)入一個(gè)輪詢循環(huán),其在循環(huán)計(jì)數(shù)超出或所有打開的通道關(guān)閉后終止。 所有參數(shù)都是可選的。 count 形參默認(rèn)為 None ,導(dǎo)致循環(huán)僅在所有通道關(guān)閉時(shí)終止。 timeout 形參為適當(dāng)?shù)?select() 或 poll() 調(diào)用設(shè)置超時(shí)參數(shù),以秒為單位; 默認(rèn)值為30秒。 use_poll 形參,如果為 True ,則表示 poll() 應(yīng)優(yōu)先使用 select() (默認(rèn)為``False``)。
map 形參是一個(gè)條目為所監(jiān)視通道的字典。 當(dāng)通道關(guān)閉時(shí)它們會(huì)被從映射中刪除。 如果省略 map,則會(huì)使用一個(gè)全局映射。 通道 (asyncore.dispatcher, asynchat.async_chat 及其子類的實(shí)例) 可以在映射中任意混合。
class asyncore.dispatcher
dispatcher 類是對(duì)低層級(jí)套接字對(duì)象的輕量包裝器。 要讓它更有用處,可以從異步循環(huán)調(diào)用一些事件處理方法。 在其他方面,它可以被當(dāng)作是普通的非阻塞型套接字對(duì)象。
在特定時(shí)間或特定連接狀態(tài)下觸發(fā)的低層級(jí)事件可通知異步循環(huán)發(fā)生了特定的高層級(jí)事件。 例如,如果我們請求了一個(gè)套接字以連接到另一臺(tái)主機(jī),我們會(huì)在套接字首次變得可寫時(shí)得知連接已建立(在此刻你將知道可以向其寫入并預(yù)期能夠成功)。 包含的高層級(jí)事件有:
|
事件 |
描述 |
|---|---|
|
由首個(gè)讀取或?qū)懭胧录?/p> |
|
由不帶可用數(shù)據(jù)的讀取事件引起 |
|
由在監(jiān)聽套接字上的讀取事件引起 |
在異步處理過程中,每個(gè)已映射通道的 readable() 和 writable() 方法會(huì)被用來確定是否要將通道的套接字添加到已執(zhí)行 select() 或 poll() 用于讀取和寫入事件的通道列表中。
因此,通道事件的集合要大于基本套接字事件。 可以在你的子類中被重載的全部方法集合如下:
-
handle_read()
當(dāng)異步循環(huán)檢測到通道的套接字上的
read()調(diào)用將要成功時(shí)會(huì)被調(diào)用。 -
handle_write()
當(dāng)異步循環(huán)檢測到一個(gè)可寫套接字可以被寫入時(shí)會(huì)被調(diào)用。 通常此方法將實(shí)現(xiàn)必要的緩沖機(jī)制以保證運(yùn)行效率。 例如:
def handle_write(self):sent = self.send(self.buffer)self.buffer = self.buffer[sent:]
-
handle_expt()
當(dāng)一個(gè)套接字連接存在帶外(OOB)數(shù)據(jù)時(shí)會(huì)被調(diào)用。 這幾乎從來不會(huì)發(fā)生,因?yàn)?OOB 雖然受支持但很少被使用。
-
handle_connect()
當(dāng)活動(dòng)打開方的套接字實(shí)際建立連接時(shí)會(huì)被調(diào)用。 可能會(huì)發(fā)送一條“歡迎”消息,或者向遠(yuǎn)程端點(diǎn)發(fā)起協(xié)議協(xié)商等。
-
handle_close()
當(dāng)套接字關(guān)閉時(shí)會(huì)被調(diào)用。
-
handle_error()
當(dāng)一個(gè)異常被引發(fā)并且未獲得其他處理時(shí)會(huì)被調(diào)用。 默認(rèn)版本將打印精簡的回溯信息。
-
handle_accept()
當(dāng)可以與發(fā)起對(duì)本地端點(diǎn)的 connect() 調(diào)用的新遠(yuǎn)程端點(diǎn)建立連接時(shí)會(huì)在偵聽通道(被動(dòng)打開方)上被調(diào)用。 在 3.2 版中已被棄用;請改用 handle_accepted()。
3.2 版后已移除.
-
handle_accepted(sock, addr)
當(dāng)與發(fā)起對(duì)本地端點(diǎn)的 connect() 調(diào)用的新遠(yuǎn)程端點(diǎn)已建立連接時(shí)會(huì)在偵聽通道(被動(dòng)打開方)上被調(diào)用。 sock 是可被用于在連接上發(fā)送和接收數(shù)據(jù)的 新建 套接字對(duì)象,而 addr 是綁定到連接另一端的套接字的地址。
3.2 新版功能.
-
readable()
每次在異步循環(huán)之外被調(diào)用以確定是否應(yīng)當(dāng)將一個(gè)通道的套接字添加到可能在其上發(fā)生讀取事件的列表中。 默認(rèn)方法會(huì)簡單地返回
True,表示在默認(rèn)情況下,所有通道都希望能讀取事件。 -
writable()
每次在異步循環(huán)之外被調(diào)用以確定是否應(yīng)當(dāng)將一個(gè)通道的套接字添加到可能在其上發(fā)生寫入事件的列表中。 默認(rèn)方法會(huì)簡單地返回
True,表示在默認(rèn)情況下,所有通道都希望能寫入事件。
此外,每個(gè)通道都委托或擴(kuò)展了許多套接字方法。 它們大部分都與其套接字的對(duì)應(yīng)方法幾乎一樣。
-
create_socket(family=socket.AF_INET, type=socket.SOCK_STREAM)
這與普通套接字的創(chuàng)建相同,并會(huì)使用同樣的創(chuàng)建選項(xiàng)。 請參閱 socket 文檔了解有關(guān)創(chuàng)建套接字的信息。
在 3.3 版更改: family 和 type 參數(shù)可以被省略。
-
connect(address)
與普通套接字對(duì)象一樣,address 是一個(gè)元組,它的第一個(gè)元素是要連接的主機(jī),第二個(gè)元素是端口號(hào)。
-
send(data)
將 data 發(fā)送到套接字的遠(yuǎn)程端點(diǎn)。
-
recv(buffer_size)
從套接字的遠(yuǎn)程端點(diǎn)讀取至多 buffer_size 個(gè)字節(jié)。 讀到空字節(jié)串表明通道已從另一端被關(guān)閉。
請注意 recv() 可能會(huì)引發(fā) BlockingIOError,即使 select.select() 或 select.poll() 報(bào)告套接字已準(zhǔn)備好被讀取。
-
listen(backlog)
偵聽與套接字的連接。 backlog 參數(shù)指明排入連接隊(duì)列的最大數(shù)量且至少應(yīng)為 1;最大值取決于具體系統(tǒng)(通常為 5)。
-
bind(address)
將套接字綁定到 address。 套接字必須尚未被綁定。 (address 的格式取決于具體的地址族 —- 請參閱 socket 文檔了解更多信息。) 要將套接字標(biāo)記為可重用的 (設(shè)置
SO_REUSEADDR選項(xiàng)),請調(diào)用 dispatcher 對(duì)象的set_reuse_addr()方法。 -
accept()
接受一個(gè)連接。 此套接字必須綁定到一個(gè)地址上并且偵聽連接。 返回值可以是
None或一個(gè)(conn, address)對(duì),其中 conn 是一個(gè)可用來在此連接上發(fā)送和接收數(shù)據(jù)的 新的 套接字對(duì)象,而 address 是綁定到連接另一端套接字的地址。 當(dāng)返回None時(shí)意味著連接沒有建立,在此情況下服務(wù)器應(yīng)當(dāng)忽略此事件并繼續(xù)偵聽后續(xù)的入站連接。 -
close()
關(guān)閉套接字。 在此套接字對(duì)象上的后續(xù)操作都將失敗。 遠(yuǎn)程端點(diǎn)將不再接收任何數(shù)據(jù)(在排入隊(duì)列的數(shù)據(jù)被清空之后)。 當(dāng)套接字被垃圾回收時(shí)會(huì)自動(dòng)關(guān)閉。
class asyncore.dispatcher_with_send
dispatcher 的一個(gè)添加了簡單緩沖輸出功能的子類,適用于簡單客戶端。 對(duì)于更復(fù)雜的用法請使用 asynchat.async_chat。
class asyncore.file_dispatcher
file_dispatcher 接受一個(gè)文件描述符或 file object 以及一個(gè)可選的 map 參數(shù),并對(duì)其進(jìn)行包裝以配合 poll() 或 loop() 函數(shù)使用。 如果提供一個(gè)文件對(duì)象或任何具有 fileno() 方法的對(duì)象,其方法將被調(diào)用并傳遞給 file_wrapper 構(gòu)造器。
可用性: Unix。
class asyncore.file_wrapper
file_wrapper 接受一個(gè)整數(shù)形式的文件描述符并調(diào)用 os.dup() 來復(fù)制其句柄,以便原始句柄可以獨(dú)立于 file_wrapper 被關(guān)閉。 這個(gè)類實(shí)現(xiàn)了足夠的方法來模擬套接字以供 file_dispatcher 類使用。
可用性: Unix。
asyncore 示例基本 HTTP 客戶端
下面是一個(gè)非常基本的 HTTP 客戶端,它使用了 dispatcher 類來實(shí)現(xiàn)套接字處理:
import asyncoreclass HTTPClient(asyncore.dispatcher):def __init__(self, host, path):asyncore.dispatcher.__init__(self)self.create_socket()self.connect( (host, 80) )self.buffer = bytes('GET %s HTTP/1.0\r\nHost: %s\r\n\r\n' %(path, host), 'ascii')def handle_connect(self):passdef handle_close(self):self.close()def handle_read(self):print(self.recv(8192))def writable(self):return (len(self.buffer) > 0)def handle_write(self):sent = self.send(self.buffer)self.buffer = self.buffer[sent:]client = HTTPClient('www.python.org', '/')asyncore.loop()
asyncore 示例基本回顯服務(wù)器
下面是一個(gè)基本的回顯服務(wù)器,它使用了 dispatcher 類來接受連接并將入站連接發(fā)送給處理程序:
import asyncoreclass EchoHandler(asyncore.dispatcher_with_send):def handle_read(self):data = self.recv(8192)if data:self.send(data)class EchoServer(asyncore.dispatcher):def __init__(self, host, port):asyncore.dispatcher.__init__(self)self.create_socket()self.set_reuse_addr()self.bind((host, port))self.listen(5)def handle_accepted(self, sock, addr):print('Incoming connection from %s' % repr(addr))handler = EchoHandler(sock)server = EchoServer('localhost', 8080)asyncore.loop()
網(wǎng)站題目:創(chuàng)新互聯(lián)Python教程:asyncore—-異步套接字處理器
鏈接分享:http://m.fisionsoft.com.cn/article/coisejd.html


咨詢
建站咨詢
