簡體   English   中英

使用python中的select從多個連接接收數據

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM