Python select() consumes 100% CPU



我正在尝试创建一个应用程序,该应用程序创建套接字并在插座上打印传入数据。选择是使用插座的首选方法,所以我写了这篇文章:

#!/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 datan").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?

但是,这是代码示例消耗一个CPU Core 的100%。

等待来自插座的数据的正确方法是什么?我需要它检查连接是否还活着。在Python中,CPU达到100%的使用情况有类似的问题,但并不能清楚地解释为什么需要某种睡眠。

您称其为(readers, writers, err = select([s], [s], []))的方式,如果它是可读或可写的,它会立即返回。但是您只检查它是否可读。

由于插座在大多数情况下可能是可写的,所以这正是您所被告知的。

另一种可能性可能是在某处添加time.sleep(0.02)。G。当您在该循环中不做其他事情时。然后,20毫秒的额外延迟不应该受伤(但是,它不是干净)。

选择的最常见用途是仅考虑rlisttimeout参数。对于您的示例代码,应该是:

while True:
    readers, writers, err = select([s], [], [])
    if s in readers:
        data = s.recv(1024)
        print(data)

仅当应用程序可能必须写大数据时,wlist参数才使用。在这种情况下,要写入套接字的数据仅排队,插座将添加到wlist中。当select返回并且有东西要写入套接字时,程序会尝试编写,如果仍然存在某些内容,则将其再次推到队列(当心:必须将其推到头部零件...),并且套接字留在wlist。如果所有内容都写了并且队列为空,则将插座从wlist中卸下。

在上文中, queue 可能是真正的双端队列,或一个简单的bytes缓冲区或任何其他容器,允许在两端添加字节。一个应存在每个插座。

最新更新