У меня есть script, который работает в бесконечном цикле и добавляет вещи в базу данных, и делает то, что я не могу просто остановить на полпути, поэтому я не могу просто нажать ctrl + C и остановить его. Я хочу иметь возможность как-то остановить цикл while, но пусть он завершит последнюю итерацию до ее остановки. Позвольте мне пояснить: мой код выглядит примерно так:
while True: does something does more things does more things
Я хочу иметь возможность прервать цикл while в конце или в начале, но не в том, чтобы делать что-то, потому что это было бы плохо. и я не хочу, чтобы он спрашивал меня после каждой итерации, если я хочу продолжить. спасибо за отличные ответы, я очень благодарен, но моя реализация, похоже, не работает:
def signal_handler(signal, frame): global interrupted interrupted = True class Crawler(): def __init__(self): # not relevent def crawl(self): interrupted = False signal.signal(signal.SIGINT, signal_handler) while True: doing things more things if interrupted: print(«Exiting..») break
когда я нажимаю ctr + c, программа просто продолжает игнорировать меня
davegri 03 окт. 2015, в 15:18
Поделиться
У вас есть какой-нибудь способ определить в вашем скрипте, что если задание выполнено (последнее)! Если вы это сделаете, используйте его в условии и используйте оператор break
Как сделать бесконечный цикл в Python!
praba230890 03 окт. 2015, в 13:07
Работа в этом случае является веб-сканером, который может продолжаться бесконечно. Я хочу быть в состоянии сказать ему, чтобы он прекратил сканирование, а не просто прерывал его, например, в середине страницы.
davegri 03 окт. 2015, в 13:08
позволить ему закончить свою последнюю итерацию, прежде чем он остановится ? Как вы знаете, выполнил ли он работу или нет?
Kevin Guan 03 окт. 2015, в 13:09
Скрипт сканирует веб-страницы. он имеет цикл for внутри бесконечного цикла while. Я хочу иметь возможность остановить бесконечный цикл while, но не во время итерации цикла for внутри.
davegri 03 окт. 2015, в 13:11
Хм . не могли бы вы добавить важную часть вашего сценария? Это может помочь другим понять, что вы хотите: P
Kevin Guan 03 окт. 2015, в 13:14
Вопрос ясен: завершите эту итерацию цикла, затем выйдите. А кто думает, что это не по теме?
alexis 03 окт. 2015, в 13:31
Показать ещё 4 комментария
Поделиться:
infinite-loop
4 ответа
Лучший ответ
Что вам нужно сделать, это поймать прерывание, установить флаг, в котором говорилось, что вы были прерваны, но затем продолжайте работать до тех пор, пока не проведете проверку флажка (в конце каждого цикла). Поскольку конструктор try-except python откажется от текущего цикла цикла, вам необходимо настроить правильный обработчик сигнала; он будет обрабатывать прерывание, но затем пусть python продолжит работу, где он остановился. Вот как:
import signal import time # For the demo only def signal_handler(signal, frame): global interrupted interrupted = True signal.signal(signal.SIGINT, signal_handler) interrupted = False while True: print(«Working hard. «) time.sleep(3) print(«All done!») if interrupted: print(«Gotta go») break
- Используйте это из командной строки. В консоли IDLE он будет растоптать собственную обработку прерываний IDLE.
- Лучшим решением было бы «заблокировать» KeyboardInterrupt на время цикла и разблокировать его, когда придет время опроса для прерываний. Это особенность некоторых Unix-аксессуаров, но не всех, поэтому python не поддерживает его (см. Третье «Общее правило» )
- OP хочет сделать это внутри класса. Но функция прерывания вызывается системой обработки сигналов с двумя аргументами: номер сигнала и указатель на стек стека — нет места для аргумента self , предоставляющего доступ к объекту класса. Следовательно, самый простой способ установить флаг — использовать глобальную переменную. Вы можете установить указатель на локальный контекст, используя замыкания (т.е. Динамически определить обработчик сигнала в __init__() , но, честно говоря, я бы не стал беспокоиться, если глобальное исключение не может быть вызвано многопоточным или каким-либо другим.
Предостережение: Если ваш процесс находится в середине системного вызова, обработка сигнала может прерывать системный вызов. Таким образом, это может быть небезопасно для всех приложений. Более безопасными альтернативами будет (а) Вместо того, чтобы полагаться на сигналы, используйте неблокируемое чтение в конце каждой итерации цикла (и введите ввод вместо того, чтобы нажимать ^ C); (b) использовать потоки или межпроцессную связь для изоляции рабочего от обработки сигнала; или (c) выполнить работу по реализации реальной блокировки сигнала, если вы находитесь на ОС, у которой она есть. Все они зависят от ОС в некоторой степени, поэтому я оставлю это на этом.
16.3 Цикл while. Операторы break и continue. Бесконечный цикл. Основы Python
Источник: overcoder.net
Превышен лимит времени в решении Codeforces. Как я могу улучшить свое решение?
Краткий обзор проблемы — данная целочисленная последовательность должна быть изменена в порядке возрастания путем применения операций сдвига (каждый элемент сдвинут на 1 позицию вправо, последний элемент становится первым). Найдите минимальное количество операций, чтобы сделать последовательность по возрастанию. Выведите -1, если это невозможно.
Я получаю TIME_LIMIT_EXCEEDED для теста 6 в приведенной выше ссылке. Я знаю, что есть более эффективные решения для этой проблемы, но если возможно, я хотел бы внести изменения в свое решение, чтобы оно работало в установленные сроки. Это будет возможно? Если да, как я могу это сделать?
#include #include #include #include #include typedef long long LL; using namespace std; bool checkAsc(vector x, int N) < for(int i=0;i<(N-1);i++) < if(x[i+1]return true; > vector shiftRight(vector int temp=x[N-1]; for(int i=(N-1);i>=1;i—) < x[i]=x[i-1]; >x[0]=temp; vector y=x; return y; > bool ifPossible(vector x, int N) < for(int i=1;i<(N-1);i++) < if((x[i]>x[i-1])(x[i]>x[i+1])(x[i+1]>x[i-1])) return false; > return true; > int main() < int n, turns=0; vector a(100000); cin>>n; for(int i=0;i>a[i]; if(!ifPossible(a, n)) cout cout return 0; >
Тест: № 6, время: 1000 мс, память: 784 КБ, код выхода: -1, код выхода из проверки: 0, вердикт: TIME_LIMIT_EXCEEDED
вход
9999899997 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 86 86 87 88 89 90 91 93 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 15 …
Решение
Во-первых, исправьте свой алгоритм, для , у вас есть бесконечный цикл (вместо -1 ).
Из вашего кода пройдите vector по const ref вместо значения, чтобы избежать ненужных копий.
ваш shiftRight может использовать vector.insert(v.back()); vector.pop_back() это та же сложность, но использовать более быстрый метод (как memcpy ); и измените тип возврата на void (как результат не используется) и так откажитесь y и его копия.
Но ваш алгоритм все еще O(N²) в то время как это может быть сделано в O(N)
int get_unicorn_shift(const std::vector auto mid = std::is_sorted_until(v.begin(), v.end()); if (mid == v.end()) < return 0; >auto end = std::is_sorted_until(mid, v.end()); if (end != v.end() || v.front() < v.back()) < return -1; >return end — mid; >
Источник: web-answers.ru
Как остановить бесконечный цикл?
Я не могу понять почему у меня условие if не отвечает, вместо этого работает цикл (просто каждый раз выдает say).
import java.util.Scanner; public class Assis < public static void main(String[] args) < Scanner say = new Scanner(System.in); System.out.print(«Hello, write your name: «); String f = say.nextLine(); System.out.println(«Hello » + f); System.out.println(«»); System.out.print(f + «, write your age: «); int a = say.nextInt(); /** * Age and name */ if (a >= 13) < System.out.println(«Let’s continue. «); >else < System.out.println(«You can’t use this programm.»); return; >while (1 < 5)< System.out.println(«Say: «); String saa = say.nextLine(); if (saa == «Please exit») < System.out.println(«Ok» + f); break; >else if (saa == «No») < System.out.println(«:(«); >> > >
- Вопрос задан более года назад
- 282 просмотра
Комментировать
Решения вопроса 2
Bigdata Engineer
Это — популярный вопрос на собеседованиях.
if (saa == «Please exit»)
Обычно в Java строки сравнивают через equals() а данное условие выше может сработать а может и нет 🙂
Вот когда оно сработает — это тема небольшой лекции по организации памяти.
Ответ написан более года назад
Комментировать
Нравится 2 Комментировать
Web 5)< System.out.println(«Say: «); >
Источник: qna.habr.com