Python отменить raw_input/ ввод через запись в стандартный ввод?
Для начала, я на Python 2.7.5 и Windows x64, мое приложение ориентировано на эти параметры.
Мне нужен способ отменить raw_input по прошествии определенного количества времени. В настоящее время у меня есть основной поток, запускающий два дочерних потока, один из которых является таймером (threading.Timer), а другой запускает raw_input. Они оба возвращают значение в Queue.queue, которое отслеживает основной поток. Затем он действует на то, что отправляется в очередь.
# snip...
q = Queue.queue()
# spawn user thread
user = threading.Thread(target=user_input, args=[q])
# spawn timer thread (20 minutes)
timer = threading.Timer(1200, q.put, ['y'])
# wait until we get a response from either
while q.empty():
time.sleep(1)
timer.cancel()
# stop the user input thread here if it's still going
# process the queue value
i = q.get()
if i in 'yY':
# do yes stuff here
elif i in 'nN':
# do no stuff here
# ...snip
def user_input(q):
i = raw_input(
"Unable to connect in last {} tries, "
"do you wish to continue trying to "
"reconnect? (y/n)".format(connect_retries))
q.put(i)
Исследования, которые я провел до сих пор, похоже, говорят о том, что невозможно "правильно" отменить тему. Я чувствую, что процессы слишком тяжелы для этой задачи, хотя я не против их использования, если это то, что действительно нужно сделать. Вместо этого я думаю, что если таймер завершает работу без ввода данных пользователем, я могу записать значение в stdin и изящно закрыть этот поток.
Итак, как мне написать в stdin из основного потока, чтобы дочерний поток принял ввод и изящно закрылся? Спасибо!
1 ответ
Вы можете использовать метод threading.Thread.join для обработки тайм-аута. Ключом к тому, чтобы заставить его работать, является установка атрибута демона, как показано ниже.
import threading
response = None
def user_input():
global response
response = raw_input("Do you wish to reconnect? ")
user = threading.Thread(target=user_input)
user.daemon = True
user.start()
user.join(2)
if response is None:
print
print 'Exiting'
else:
print 'As you wish'