Запуск python script за заданное пользователем количество времени?

Извините, это, наверное, ужасный вопрос. Я JUST начал изучать python сегодня. Я читал байт Python. Прямо сейчас у меня есть проект для Python, который включает время. Я не могу найти ничего, связанного со временем в байте Python, поэтому я спрошу вас:

Как я могу запустить блок для указанного пользователем времени и затем разорвать?

Например (в некотором псевдокоде):

time = int(raw_input('Enter the amount of seconds you want to run this: '))
while there is still time left:
    #run this block

или даже лучше:

import sys
time = sys.argv[1]
while there is still time left:
    #run this block

Спасибо за любую помощь. Кроме того, были бы высоко оценены дополнительные онлайн-руководства и учебные пособия. Мне очень нравится Byte of Python. Однако погружение в Python не может привлечь мое внимание. Полагаю, я должен сосать его и попытаться прочитать его.

Ответы

Ответ 1

Я рекомендую создать еще один thread, сделав его демона, затем спать, пока вы не захотите, чтобы задача умерла. Например:

from time import sleep
from threading import Thread

def some_task():
    while True:
        pass

t = Thread(target=some_task)  # run the some_task function in another
                              # thread
t.daemon = True               # Python will exit when the main thread
                              # exits, even if this thread is still
                              # running
t.start()

snooziness = int(raw_input('Enter the amount of seconds you want to run this: '))
sleep(snooziness)

# Since this is the end of the script, Python will now exit.  If we
# still had any other non-daemon threads running, we wouldn't exit.
# However, since our task is a daemon thread, Python will exit even if
# it still going.

Интерпретатор Python отключится, когда все не-демонные потоки завершатся. Поэтому, когда ваш основной поток выйдет, если только другой поток работает, ваша задача состоит в том, что вы работаете в отдельном потоке демона, тогда Python просто выйдет. Это удобный способ запустить что-то в фоновом режиме, если вы хотите просто выйти, не беспокоясь о том, чтобы вручную заставить его выйти и ждать его остановки.

Иными словами, преимущество, которое этот подход использует при использовании sleep в цикле for, заключается в том, что вам нужно запрограммировать свою задачу таким образом, чтобы она разбивалась на дискретные куски, а затем проверяла каждую так часто идет ли ваше время. Что может быть хорошо для ваших целей, но у него могут быть проблемы, например, если каждый кусок занимает значительное количество времени, что приводит к тому, что ваша программа будет работать значительно дольше, чем введенный пользователем, и т.д. Это проблема для вас зависит от задачи, которую вы пишете, но я подумал, что упомянул бы этот подход, если вам будет лучше.

Ответ 2

Попробуйте time.time(), который возвращает текущее время как количество секунд с установленного времени, называемого эпохой (полночь 1 января 1970 года для многих компьютеров). Вот один из способов его использования:

import time

max_time = int(raw_input('Enter the amount of seconds you want to run this: '))
start_time = time.time()  # remember when we started
while (time.time() - start_time) < max_time:
    do_stuff()

Итак, мы будем зацикливаться до тех пор, пока время с момента начала работы меньше указанного пользователем максимума. Это не идеально: прежде всего, если do_stuff() занимает много времени, мы не остановимся, пока не закончим, и мы обнаружим, что мы прошли наш крайний срок. Если вам нужно прервать выполнение задачи, как только время истечет, проблема усложняется.

Ответ 3

Если вы работаете в Linux и хотите прервать длительный процесс, используйте сигнал:

import signal, time

def got_alarm(signum, frame):
    print 'Alarm!'

# call 'got_alarm' in two seconds:
signal.signal(signal.SIGALRM, got_alarm)
signal.alarm(2)

print 'sleeping...'
time.sleep(4)

print 'done'