使用以下代码,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()
阻止?
答案 0 :(得分:0)
poll_obj.poll()
应该阻塞,直到在一个已注册的文件描述符中读取内容。您希望阻止的阻止是一个理想的功能。如果这不是您想要的,请不要使用poll
。
其他命令可能要么快速打印(并且轮询不必等待文件描述符有东西要读取)或快速终止。阻塞时间可能为零或接近于零,但poll
遵循与sleep
情况相同的逻辑。
sleep
不打印任何内容并且不会快速终止,因此轮询会按预期被阻止。
修改强>
您使用does not affectpoll
the way you expect的 O_NONBLOCK
。即使没有任何内容可读,也请立即使用poll_obj.poll(0)
从通话中返回。