非阻塞调用的睡眠

0 投票
3 回答
1413 浏览
提问于 2025-04-17 02:11

我在寻找一个最佳的休眠时间,以便从一个非阻塞的套接字接收数据。例如:

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

如果不休眠的话,CPU使用率会达到100%。所以有没有什么好的建议,能让CPU使用率和带宽达到最佳?休眠多长时间才能让CPU进行线程切换呢?

顺便问一下,设置套接字的缓冲区通过SO_SNDBUF/SO_RECVBUF,并且设置TCP_NODELAY,这样做有意义吗?还是说这两个设置不应该一起使用?

3 个回答

1

使用 select。这个功能基本上是让程序暂停,等到网络连接上有数据可以用的时候再继续运行。

3

如果你打算使用 sleep(),那为什么不直接使用阻塞套接字呢?

2

你不应该自己去做那个。可以使用 select 这个方法,如果你希望你的代码能定期醒来,即使没有收到数据,也可以设置一个超时时间。

顺便说一下,TCP_NODELAY 是在发送端的设置,不会影响你的 read 操作。

撰写回答