2011-09-13 184 views
0

我要尋找一個最佳的睡眠值從非阻塞套接字接收數據。例如:睡眠呼籲

while True: 
    data=s.recv(1024) 
    if not data: 
     time.sleep(10) #10ms 
    else: 
     pass #... 

沒有睡眠會導致100%的CPU使用率,所以任何想法如何獲得最佳的CPU使用率和帶寬?中央處理器可以進行線程切換多長時間?

順便說一句,它是有意義的通過SO_SNDBUF/SO_RECVBUF設置套接字的緩衝區,並設置TCP_NODELAY或不應該,他們結合起來?

+0

忘掉模式。現在!忘記一個函數'sleep()'曾經存在過。對於sleep()的每個用法,都有另一種更合適的方法。 –

回答

2

你不應該自己這樣做。使用select調用,如果您需要您的代碼每隔幾分鐘喚醒一次,即使沒有收到數據,也會發生超時。

BTW,TCP_NODELAY是發送方的,不會影響您的read秒。

+0

在我的情況下,套接字開關讀取/寫入呼叫。的recv /發送/發送/發送/ RECV/RECV/... –

1

使用select。它基本上會暫停程序,並在套接字上有數據時將其喚醒。

+0

我以爲當我使用select(...)時,當我返回並嘗試接收它時,數據可以在非阻塞套接字中消失。 –

+1

@Mister號你從哪裏得到這個想法?除非發生編程錯誤,否則不能通過任何API將數據丟失到TCP/IP。 – EJP

3

如果你打算使用sleep(),你爲什麼不只是使用阻塞套接字?