/ usr / bin / sleep导致poll对象阻塞

时间:2015-02-12 11:18:27

标签: python subprocess

使用以下代码,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()阻止?

1 个答案:

答案 0 :(得分:0)

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

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

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

修改

您使用does not affect poll the way you expect

O_NONBLOCK。即使没有任何内容可读,也请立即使用poll_obj.poll(0)从通话中返回。