我遇到了python中的select问题,我有一段代码允许客户端从服务器接收数据,并通过读取stdin并在服务器套接字上写入来发送它:
readfds = [s, sys.stdin]
writefds = [s, sys.stdout]
my_level = get_my_level(s)
is_co = True
cmd = ""
while (is_co):
read, write, exception = select.select(readfds, writefds, [], 1)
if (not (read or write or exception)):
print "Timeout"
else:
for sock in read:
if (sock == s):
cmd = readline(s)
print cmd
elif (sock == sys.stdin):
cmd = sys.stdin.readline()
s.sendall(cmd)
if (cmd == "mort"):
is_co = False
我认为这是因为选择是非阻塞的,但当我阻止它时,它是同样的事情。你能解释我的代码中的错误吗?
由于
答案 0 :(得分:5)
据推测,你总是可以写信给sys.stdout
,所以select.select
应立即回复,让你知道你可以写些东西。然后,此代码处理可读列表,然后重新进入循环。但是sys.stdout
没有任何改变,所以它仍然是可写的。
这将在紧密循环中执行并刻录CPU。
答案 1 :(得分:0)
我有类似的问题,所以我不断轮询套接字(在我的情况下为UDP)并使用sleep()超时。在此代码中,CPU使用率从100%上升到大约4%
sUDP = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)
sUDP.bind((host, portIn))
sUDP.setblocking(0)
sUDP.settimeout(0.5)
while True:
try:
data, addr = sUDP.recvfrom(4096)
... #some data processing code here
except:
time.sleep(0.02)