加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

Python select()行为很奇怪

发布时间:2020-12-16 23:03:53 所属栏目:Python 来源:网络整理
导读:我在理解select.select的行为时遇到了一些麻烦.请考虑以下 Python程序: def str_to_hex(s): def dig(n): if n 9: return chr(65-10+n) else: return chr(48+n) r = '' while len(s) 0: c = s[0] s = s[1:] a = ord(c) / 16 b = ord(c) % 16 r = r + dig(a)
我在理解select.select的行为时遇到了一些麻烦.请考虑以下 Python程序:
def str_to_hex(s):
    def dig(n):
        if n > 9:
            return chr(65-10+n)
        else:
            return chr(48+n)
    r = ''
    while len(s) > 0:
        c = s[0]
        s = s[1:]
        a = ord(c) / 16
        b = ord(c) % 16
        r = r + dig(a) + dig(b)
    return r

while True:
    ans,_,_ = select.select([sys.stdin],[],[])
    print ans
    s = ans[0].read(1)
    if len(s) == 0: break
    print str_to_hex(s)

我已将其保存到文件“test.py”.如果按如下方式调用它:

echo 'hello' | ./test.py

然后我得到了预期的行为:选择never块并打印所有数据;程序然后终止.

但如果我以交互方式运行程序,我会得到一个最不受欢迎的行为.请考虑以下控制台会话:

$./test.py
hello
[<open file '<stdin>',mode 'r' at 0xb742f020>]
68

程序然后挂在那里; select.select现在再次阻止.直到我提供更多输入或关闭输入流,即使已经有字符在等待,也会打印下一个字符(以及其余所有字符)!任何人都可以向我解释这种行为吗?我在一个我编写的流隧道程序中看到了类似的东西,它破坏了整个事件.

谢谢阅读!

解决方法

sys.stdin的read方法比select更高的抽象级别.当您执行ans [0] .read(1)时,python实际上从操作系统读取更多的字节并在内部缓冲它们. select不知道这个额外的缓冲;它只会看到所有内容都已被读取,因此会阻止,直到EOF或更多输入到达.您可以通过运行类似strace -e read,select python yourprogram.py来观察此行为.

一种解决方案是用os.read(ans [0] .fileno(),1)替换ans [0] .read(1). os.read是一个较低级别的接口,它与操作系统之间没有任何缓冲,所以它更适合select.

或者,使用-u命令行选项运行python似乎也禁用了额外的缓冲.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读