【问题标题】:CPU reaching 100% usage with select in python在 python 中使用 select 达到 100% 的 CPU 使用率
【发布时间】:2013-06-30 04:20:27
【问题描述】:

我在 python 中的选择有问题,我有一段代码允许客户端从服务器接收数据并通过在标准输入上读取并在服务器套接字上写入来发送数据:

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

我认为这是因为选择是非阻塞的,但当我让它阻塞时,它是同一回事。你能解释一下我的代码中有错吗?

谢谢

【问题讨论】:

  • 你能解释一下你的标题是什么意思吗?
  • 您能详细解释一下问题所在吗?你的 CPU 达到 100%?如果你永远不会得到“mort”,那么你就有一个无限循环,所以你的程序会一遍又一遍地尝试......除了这似乎是设计使然。请提供更多信息。
  • 当我使用这个选择启动我的代码时,我的 CPU 使用率达到 100%

标签: python select


【解决方案1】:

大概你总是可以写信给sys.stdout,所以select.select应该马上回来让你知道你可以写信。该代码然后处理可读列表,然后重新进入循环。但是sys.stdout 没有任何改变,所以它仍然是可写的。

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

【讨论】:

  • @majined 确保您有机会点击旁边的复选标记“接受”这个答案。它将奖励回答者 (+15) 和您的勤奋和跟进 (+2)。
【解决方案2】:

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

【讨论】:

  • 如果你不使用 UDP,在你的 select poll 的底部添加这样的 sleep 将实现与 TCP 相同的效果
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-16
  • 2020-10-06
  • 2015-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多