Отправить флаг программе Python для выхода в свое время.Windows - PullRequest
0 голосов
/ 19 февраля 2019

Я пишу долгосрочную программу первичного поиска, которую можно закрыть и снова открыть с помощью системы записи найденных простых чисел в файл.Я не хочу помогать с algs, но мне нужен метод уничтожения программы только , когда она достигает конца основного цикла, т.е. она полностью нашла простое число.Ниже приведены соответствующие части кода.

check = 7

def isprime(n):
  #do...

while True:
  if isprime(check):
    print(check, "is prime")
  else:
    print(check, "isn't prime")
  check += 2

Этот код не будет работать, но это хороший шаблон, поскольку мой вопрос не относится к моей программе.Я хочу break из основного цикла while True, только в конце.Единственное решение, которое я могу придумать, которое вообще не практично, - это конец while True, который я читаю в файле, и если это «стоп», то я break.Тем не менее, я не хочу вводить в файл, когда я хочу остановить, и чтение файла - пустая трата времени.

Извините, если этот вопрос основан на мнении, но я попробовал свойлучший.

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Threading - это хороший вариант, предложенный другими.Тем не менее, вы можете иметь более легкую опцию использования try / кроме перехвата прерывания клавиатуры и использования флага end.Если сигнал уничтожения будет отправлен во время вычисления isprime(), текущий расчет для isprime() будет уничтожен, check не будет увеличен на 2, блок except будет выполнен для переключения флага end на True, и затем вы перезапустите расчет isprime для предыдущего check, пока не закончите, увеличиваете, затем break.Преимущество этого метода в том, что он легче, чем накладные расходы на создание нового потока (что мало по сравнению с созданием нового процесса), и что его легче отлаживать, чем многопоточный скрипт.Тем не менее, многопоточная опция подходит для отладки, если код не станет намного больше, и вам не понадобятся другие потоки как часть того же сценария.

end = False
while True:
    try:
        if isprime(check):
            print(check, "is prime")
        else:
            print(check, "isn't prime")
        check += 2
        if end: 
            break
    except KeyboardInterrupt:
        print('end signal received')
        end = True
0 голосов
/ 19 февраля 2019

Вы можете определить функцию для создания простого числа и другую функцию для прослушивания сигналов KeyboardInterrupt, как прокомментировал Ральф.В своей основной функции в конце выполните

if not Keyboard_thread.is_alive():
    break

. Это позволит вашему коду проверить, что он не был остановлен только в конце цикла, что позволит избежать завершения вашей программы в середине.расчет.Документация по потокам на https://docs.python.org/2/library/threading.html для большей глубины!хотя вы хотите сделать что-то вроде

t = threading.Thread(target=your_function, args=[your_list_of_parameters](arguments are optional))
t.start()

Извините, если вы уже знаете темы, но это не было частью вашего сообщения, поэтому я предполагаю, что вы не знаете.

Вы можете позвонитьt.join() для завершения потока, ожидающего прерывания клавиатуры (с указанием тайм-аута), или прекращения функции.После этого будет помечен ваш другой поток (тот, который проверяет keyboard_thread.is_alive(), что он также должен выйти из своего цикла. Примечание: потоки работают только до конца функции, которую вы им назначаете, например, если ваша функция:

def new_function():
    print("hey")

Если вы назначите поток для этой функции, поток напечатает «эй» один раз, а затем завершит себя после достижения конца функции. Не стесняйтесь оставлять комментарий, если что-то, что я сказал, неясно!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...