Поскольку вы хотите иметь возможность управлять через командную строку, один из способов сделать это - использовать временный файл «flag», который будет создан myprogram.py start
и удален myprogram.py stop
.Ключ в том, что, пока файл существует, myprogram.py
будет продолжать цикл.
import os
import sys
import time
FLAGFILENAME = 'startstop.file'
def set_file_flag(startorstop):
# In this case I am using a simple file, but the flag could be
# anything else: an entry in a database, a specific time...
if startorstop:
with open(FLAGFILENAME, "w") as f:
f.write('run')
else:
if os.path.isfile(FLAGFILENAME):
os.unlink(FLAGFILENAME)
def is_flag_set():
return os.path.isfile(FLAGFILENAME)
def get_from_ftp(server, login, password):
print("Still running...")
time.sleep(1)
def main():
if len(sys.argv) < 2:
print "Usage: <program> start|stop"
sys.exit()
start_stop = sys.argv[1]
if start_stop == 'start':
print "Starting"
set_file_flag(True)
if start_stop == 'stop':
print "Stopping"
set_file_flag(False)
server, login, password = 'a', 'b', 'c'
while is_flag_set():
get_from_ftp(server, login, password)
print "Stopped"
if __name__ == '__main__':
main()
Как вы можете себе представить, флаг может быть чем-то другим.Это очень просто, и если вы хотите, чтобы было запущено более двух экземпляров, вы должны как минимум по-разному называть файлы для каждого экземпляра (например, с параметром CLI), чтобы вы могли выборочно остановить каждый экземпляр.
Мне нравится идея, предложенная @cdarke о перехвате и обработке CTRL + C, хотя механизм очень похож на мой подход и хорошо работает с одним экземпляром.