繁体   English   中英

Python select()消耗100%CPU

[英]Python select() consumes 100% CPU

我正在尝试创建一个应用程序,该应用程序将创建一个套接字并打印传入的数据(出现在套接字上)。 select是使用套接字的首选方法,所以我这样写:

#!/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?

但是,此代码示例消耗了一个CPU内核的100%

在具有无阻塞套接字的情况下,等待没有无休止循环的套接字中的数据的正确方法是什么? 我需要它来检查连接是否仍然有效。 有一个类似的问题,在python中使用select时,CPU的使用率达到100%,但这并不能清楚地解释为什么需要某种睡眠。

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

由于套接字在大多数情况下可能是可写的,因此正是您所要知道的。

另一种可能是在某个地方添加time.sleep(0.02) ,例如,当您在该循环中不执行任何其他操作时。 然后,20毫秒的额外延迟应该不会受到伤害(但是,这并不干净)。

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

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

wlist参数仅在应用程序可能必须写入大数据时使用。 在这种情况下,仅将要写入套接字的数据排队,然后将套接字添加到wlist select返回并且有一些内容要写入套接字时,程序将尝试写入,如果仍有剩余,则将其再次推送到队列中(请注意:必须推送到头部...),然后将套接字保留在其中wlist 如果所有内容均已写入并且队列为空,则将套接字从wlist删除。

在上面的文本中, 队列可以是真正的双端队列,也可以是简单的bytes缓冲区,也可以是允许在两端添加字节的任何其他容器。 每个插槽应有一个。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM