[英]Receiving data from multiple connections using select in python
我對使用select()
時如何繼續調用recv()
感到有些困惑。 這段代碼並不完整,但是可以說明問題。 假設我們從每個連接中都收到大量數據(10,20mb)。
您是否應該繼續使用recv()
循環直到調用select()
之后獲得所需的字節數?
while True:
r,w,e = select.select(r_ready, w_ready, [], timeout)
for client in r:
if client == sock:
acceptConnection(sock)
else:
chunks = []
bytesRead = 0
while bytesRead < desiredBytes:
chunk = client.recv(1024)
bytesRead += len(chunk)
還是應該在每個select()循環之后只調用一次recv()?
clientBuffers = {}
while True:
r,w,e = select.select(r_ready, w_ready, [], timeout)
for client in r:
if client == sock:
acceptConnection(sock)
else:
chunk = client.recv(1024)
clientBuffers[client].append(chunk)
是否應該繼續使用recv()循環,直到調用select()之后獲得所需的字節數為止?
一般來說,不可以; 因為您無法知道將花費多長時間。 (例如,就您所知,客戶端可能直到它發送序列中的第一個字節后一個小時才發送(或網絡可能無法傳遞)所需字節的整個序列;這意味着如果您停留在循環中,則調用recv (),直到獲得所有字節為止,然后所有其他客戶端很可能很長時間都不會從服務器獲得任何響應-對於多客戶端服務器,這顯然不是可取的舉動!)
相反,只要從recv()中獲取盡可能多的字節即可,如果尚未收到足夠的字節來執行操作,則將接收到的字節存儲在緩沖區中,以備以后使用,然后返回常規的select()呼叫。 select()應該是您事件循環中唯一被阻止的位置。 強烈建議將所有套接字都設置為非阻塞狀態,以確保您不會在recv()調用中意外阻塞。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.