Запуск сценария Python в течение указанного пользователем времени? - PullRequest
16 голосов
/ 14 мая 2010

Извините, это, наверное, ужасный вопрос. Я ТОЛЬКО начал изучать Python сегодня. Я читал Байт Python. Сейчас у меня есть проект для Python, который требует времени. В Byte of 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

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

Ответы [ 3 ]

18 голосов
/ 14 мая 2010

Я рекомендую порождать другой поток , делая его потоком демона , затем sleep , пока вы не захотите, чтобы задача умерла. Например:

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's still going.

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

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

14 голосов
/ 14 мая 2010

Попробуйте 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() занимает много времени, мы не остановимся, пока он не закончится, и не обнаружим, что мы вышли за крайний срок. Если вам нужно прервать выполняемую задачу по истечении времени, проблема усложняется.

4 голосов
/ 16 мая 2010

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

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'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...