【问题标题】:Python multithreading interrupt input()Python多线程中断输入()
【发布时间】:2015-08-16 04:14:13
【问题描述】:

您好,我是 python 的新手,我正在尝试创建一个程序来启动一个线程,该线程在五秒钟后将中断 input () 函数并打印消息“完成!”。
目前它只打印“完成!”输入后。即使五秒钟过去了,用户也必须在消息“完成!”之前输入输入。被陈列。如何让线程中断 input() 函数?

import time
import threading

def fiveSec():
    time.sleep(5)
    print('Done!')

def main():
    t = threading.Thread(target = fiveSec)
    t.daemond = True
    t.start()
    input('::>')

if __name__ == '__main__':
    main()

(使用 Python 版本 3.4.2)

【问题讨论】:

标签: python multithreading input interrupt


【解决方案1】:

您不需要线程来执行此操作,而是使用信号:

import signal
def interrupted(signum, frame):
    print "Timeout!"
signal.signal(signal.SIGALRM, interrupted)
signal.alarm(5)
try:
    s = input("::>")
except:
    print "You are interrupted."
signal.alarm(0)

您可以阅读有关信号模块的文档: https://docs.python.org/2/library/signal.html

【讨论】:

  • 根据文档,SIGALRM 似乎不适用于 Windows。该文档不提供任何替代方案
【解决方案2】:

正如 NeoWang 所示,您可以通过信号来实现。您也可以使用线程和信号来执行此操作。这是一个稍微完整的例子,它可以让你输入多行数据,如果你按下回车超过 5 秒就会退出:

import time
import threading
import os
import signal

class FiveSec(threading.Thread):
    def restart(self):
        self.my_timer = time.time() + 5
    def run(self, *args):
        self.restart()
        while 1:
            time.sleep(0.1)
            if time.time() >= self.my_timer:
                break
        os.kill(os.getpid(), signal.SIGINT)


def main():
    try:
        t = FiveSec()
        t.daemon = True
        t.start()
        while 1:
            x = input('::> ')
            t.restart()
            print('\nYou entered %r\n' % x)
    except KeyboardInterrupt:
        print("\nDone!")

if __name__ == '__main__':
    main()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-18
    • 2023-03-14
    • 2023-02-26
    • 2013-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多