2010-01-20 2 views
6

Привет всем, У меня есть сценарий, который работает какИзящный выход из программы на Python?

while True: 
    doStuff() 

Каков наилучший способ общения с этим сценарием, если мне нужно, чтобы остановить его, но я не хочу, чтобы убить его, если он находится в середина операции?

Спасибо!

ответ

7

Лучший способ переписать сценарий, чтобы он не использовал while True:.

К сожалению, невозможно догадаться, что это можно прекратить.

Вы можете использовать сигналы Linux.

Вы можете использовать таймер и остановиться через некоторое время.

У вас может быть dostuff вернуть значение и остановиться, если значение False.

Вы можете проверить локальный файл и остановить, если файл существует.

Вы можете проверить FTP-сайт для удаленного файла и остановить файл.

Вы можете проверить веб-страницу HTTP для информации, которая указывает, должен ли цикл останавливаться или не останавливаться.

Вы можете использовать специфичные для ОС вещи, такие как семафоры или разделяемая память.

+0

спасибо за быстрый ответ, определенно некоторые хорошие идеи, о которых я не думал. – James

5

Я думаю, что самое элегантное будет:

keep_running = true 
while keep_running: 
    dostufF() 

, а затем dostuff() может установить keep_running = false всякий раз, когда в больше не хочет продолжать работать, то концы времени цикла, и все очищает хорошо.

2

Если это консольное приложение и выход, нажав Ctrl + C, это нормально, может ли это решить вашу проблему?

try: 
    while True: 
    doStuff() 
except KeyboardInterrupt: 
    doOtherStuff() 

Я думаю, что проблема с этим подходом является то, что вы не имеете никакого контроля, когда и где в DoStuff выполнение прекращается.

7

И я предполагаю, что вы имеете в виду убийство из-за скрипта python.

Путь я нашел самый простой является

@atexit.register 
def cleanup() 
    sys.unlink("myfile.%d" % os.getpid()) 

f = open("myfile.%d" % os.getpid(), "w") 
f.write("Nothing") 
f.close() 
while os.path.exists("myfile.%d" % os.getpid()): 
    doSomething() 

Затем завершить сценарий просто удалить myfile.xxx и приложение должно выйти за вас. Вы можете использовать это даже при одновременном использовании нескольких экземпляров одного и того же скрипта, если вам нужно только закрыть его. И он пытается очистить после себя ....

-1

Сигнальный модуль может захватывать сигналы и реагировать соответственно?

Смежные вопросы