等待输入时thread.interrupt_main() 不起作用



我已经读过这种使阻塞IO操作超时的技术,问题是它似乎不起作用。 例如:

import thread, threading
   
def read_timeout(prompt, timeout=10.0):
    timer = threading.Timer(timeout, thread.interrupt_main)
    s = ''
    timer.start()
    
    try:
        s = raw_input(prompt)
    except KeyboardInterrupt:
        print 'operation timed out.'
        
    timer.cancel()
    return s
    
s = read_timeout('enter input: ')
if s:
    print 'you entered: %s' % s

这不会中断主线程,直到 raw_input() 返回。任何帮助,不胜感激。

更新:

使用 os.kill(os.getpid(), signal.SIGINT) 而不是 thread.interrupt_main() 似乎有效(至少在 Linux 上,它没有给我最初想要的可移植性)。但是,我仍然想知道为什么上面的代码不起作用。

在Unix机器上,有一种方法可以做你想做的事情。 看看这篇文章:raw_input和超时

只需删除第 5 行末尾的逗号,否则在程序终止之前不会显示提示。

在同一页面上,还有适用于Windows操作系统的解决方案,但我还没有测试它以了解它是否有效。

根据 API 的最新文档: https://docs.python.org/3/library/_thread.html#thread.interrupt_main

这不会发出相应的信号,但会计划对关联处理程序(如果存在)的调用。

并且调用是在主线程中的当前阻塞调用之后执行的。

相反,更新中提到的 os.kill 解决方案实际上向主线程发出信号。

很抱歉,这个问题提出已经有一段时间了,但希望它仍然有帮助。

相关内容

  • 没有找到相关文章

最新更新