gpt4 book ai didi

python - select.select() 如何工作?

转载 作者:IT老高 更新时间:2023-10-28 22:15:55 26 4
gpt4 key购买 nike

背景:

我熟悉 C 的 select() 函数。我一直在将此功能用于许多目的。其中大多数(如果不是全部)用于读取和写入管道、文件等。我必须说我从未使用过错误列表,但这不涉及关键问题。

问题:

Python 的 select() 行为是否如下?

在我看来,Python 上的 select() 行为方式不同,尽管 straightforward C select() 的接口(interface)。 select() 似乎在文件第一次准备好读取时返回。如果您在读取文件的同时保留一些要读取的字节,则调用 select() 将阻塞。但是,如果您在上一次调用 select() 之后再次调用 select() 而这两个调用之间没有任何读取调用,则 select() 将按预期返回。例如:

import select
# Open the file (yes, playing around with joysticks)
file = open('/dev/input/js0', 'r')
# Hold on the select() function waiting
select.select([file], [], [])
# Say 16 bytes are sent to the file, select() will return.
([<open file '/dev/input/js0', mode 'r' at 0x7ff2949c96f0>], [], [])
# Call select() again, and select() will indeed return.
select.select([file], [], [])
([<open file '/dev/input/js0', mode 'r' at 0x7ff2949c96f0>], [], [])
# read 8 bytes. There are 8 bytes left for sure. Calling again file.read(8) will empty the queue and would be pointless for this example
file.read(8)
'<\t\x06\x01\x00\x00\x81\x01'
# call select() again, and select() will block
select.select([file], [], [])
# Should it block? there are 8 bytes on the file to be read.

如果这是 Python 中 select() 的行为,我可以接受,我可以处理它。虽然不是我所期望的,但还好。我知道我能用它做什么。

但如果这不是 select() 的行为,我会很感激有人告诉我我做错了什么。我读到的关于 select() 的内容是 Python 文档所说的:“如果读|写|错误列表中的任何文件准备好读|写|错误,则 select() 返回。”。没关系,那里没有谎言。也许问题应该是:

  • 何时认为文件已准备好在 python 中读取?
  • 是指一个从未被读取过的文件吗?
  • 是不是表示要读取字节的文件?

最佳答案

Python 的 select() 正如您所期望的那样作为 select() 系统调用传递,但是您遇到的阻塞问题可能是另一个问题与缓冲有关。只是为了让自己满意 select() 正在做正确的事情,请尝试在文件系统上读取/写入文件,而不是使用诸如操纵杆之类的特殊设备。

您可能想要更改您的 open() 调用。 python open默认情况下,调用将使用缓冲读取,因此即使您执行 read(8) 它也可能会从输入文件中读取更多数据并缓冲结果。您需要将 buffering 选项设置为 open 以便游戏杆设备以无缓冲方式打开。

建议您尝试:

  • Python 默认以文本模式打开文件。在处理操纵杆等特殊设备时,您可能希望打开的 moderb
  • 以无缓冲模式打开文件。
  • 如果您要进行基于 select 的调用,请将设备设置为非阻塞模式。尝试使用带有 os.O_RDONLY|os.O_NONBLOCK 标志的 os.open()

关于python - select.select() 如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11591054/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com