【问题标题】:/usr/bin/sleep causes poll object to block/usr/bin/sleep 导致 poll 对象阻塞
【发布时间】:2015-02-12 11:18:27
【问题描述】:

使用以下代码,poll_obj.poll() 会阻塞直到睡眠完成:

import select, subprocess, time, fcntl, os

poll_obj = select.poll()
popen_obj = subprocess.Popen("sleep 5", stdout=subprocess.PIPE, stderr=subprocess.PIPE, 
                             close_fds=True, shell=True)
fcntl.fcntl(popen_obj.stdout, fcntl.F_SETFL, os.O_NONBLOCK)
fcntl.fcntl(popen_obj.stderr, fcntl.F_SETFL, os.O_NONBLOCK)
poll_obj.register(popen_obj.stdout)
poll_obj.register(popen_obj.stderr)
start_time = time.time()
poll_obj.poll()
print(time.time() - start_time)

据我了解,poll_obj.poll() 不应阻塞,因为在它跟踪的 FD 上设置了 O_NONBLOCK 标志。它应该返回None

有没有办法防止poll_obj.poll()被屏蔽?

【问题讨论】:

    标签: python subprocess


    【解决方案1】:

    poll_obj.poll() 应该阻塞,直到在一个已注册的文件描述符中有要读取的内容。您想要阻止的阻塞是一个理想的功能。如果那不是您想要的,请不要使用poll

    其他命令可能要么快速打印某些内容(并且 poll 不必等待文件描述符读取某些内容)或快速终止。阻塞时间可能为零或接近于零,但poll 遵循与sleep 情况相同的逻辑。

    sleep 不打印任何内容且不会快速终止,因此轮询按预期被阻止。

    编辑

    O_NONBLOCK 你使用了does not affect poll the way you expect。使用poll_obj.poll(0) 立即从调用中返回,即使没有可阅读的内容。

    【讨论】:

    • poll() 通常不会阻塞在我发布的代码中,因为在它跟踪的 FD 上设置了 O_NONBLOCK 标志。您可以使用其他一些长时间运行的命令来尝试它,您会看到 poll() 通常返回 None。
    • 是的,以某种方式,但不是您期望的方式。 poll_obj.poll(0) 会做(我试过了),正如我在编辑的答案中提到的那样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-09
    • 1970-01-01
    相关资源
    最近更新 更多