使用python中的select,CPU使用率达到100%

2024-04-19 05:00:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我在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

我想这是因为select是非阻塞的,但是当我让它阻塞时,它是一样的。你能解释一下我的代码有什么错误吗?在

谢谢


Tags: 代码服务器cmdreadifismystdin
1条回答
网友
1楼 · 发布于 2024-04-19 05:00:25

假设您总是可以写入sys.stdout,因此select.select应该立即返回,让您知道您可以写入某些内容。然后,该代码处理可读列表,然后重新进入循环。但是对于sys.stdout没有任何变化,因此它仍然是可写的。在

这将在一个紧密的循环中执行并消耗CPU。在

网友
2楼 · 发布于 2024-04-19 05:00:25

我也有类似的问题,所以我不断地轮询套接字(在我的例子中是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)

相关问题 更多 >