2011-09-13 179 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(),你为什么不只是使用阻塞套接字?