【发布时间】:2019-03-04 16:42:58
【问题描述】:
我正在尝试创建一个应用程序,该应用程序创建一个套接字并在传入数据出现在套接字时打印它们。 select is the preferred method to work with sockets 所以我写了这个:
#!/usr/bin/python3
from select import select
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('localhost', 2345))
s.setblocking(False) # True did not change anything
#s.settimeout(2) # same behavior if uncommented
s.send(("give me data\n").encode("latin1"))
while True:
readers, writers, err = select([s], [s], [])
if s in readers:
data = s.recv(1024)
print(data)
# some kind of sleep here?
但是,这是代码示例消耗 100% 的一个 CPU 内核。
在具有非阻塞套接字的情况下等待来自套接字的数据的正确方法是什么?我需要它来检查连接是否仍然存在。有一个类似的问题CPU reaching 100% usage with select in python,但没有清楚解释为什么需要某种睡眠。
【问题讨论】:
-
不确定是否重复,但此页面上的答案可能会有所帮助 - stackoverflow.com/questions/17431690/…
-
很可能您的
select会立即返回,因为您的套接字总是准备好写入。 -
您正在将
s添加到“写入”选择器列表中,但没有进行任何写入。因此,select 总是立即返回并准备好写入。不要选择你实际上没有做的操作 -
但是,“某种睡眠”本来就是这里的答案;
time.sleep(0.1)。如果您不打算在循环中写入,请不要将您的套接字放在 writer 列表中(它几乎随时都可以写入)。 -
如果您有一些数据要尽快在该套接字上发送,您应该只在您的 write-selectors-list 中包含一个套接字,因此需要
select()在有空间时立即返回在该套接字的输出缓冲区中保存它。