2015-08-16 2 views
1

Привет Я довольно новичок в python, и я пытаюсь создать программу, которая запускает поток, который через пять секунд прервет функцию input() и распечатает сообщение «Done!».
В настоящее время он печатает только «Готово!» После ввода ввода. Даже после того, как прошло пять секунд, пользователь должен ввести ввод перед сообщением «Готово!». отображается. Как я могу заставить поток прерывать функцию input()?Python multithreading interrupt 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)

+0

Какую ОС вы используете? –

+0

['select.poll()'] (https://docs.python.org/3/library/select.html#select.poll)? – kay

ответ

2

Вам не нужна нитка, чтобы сделать это, используйте сигнал вместо:

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

+0

SIGALRM, похоже, не работает на окнах, согласно документации. В документации нет альтернатив –

1

Как показывает 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()