Форум сайта python.su
Добрый день. Задача такая: при работе скрипта нужно его остановить, а затем продолжить выполнение с того же места остановки. Например, при парсинге или массовой отправки сообщений smtp. Т.е. структура, я думаю, будет одна: из списка берется url или email и обрабатывается в функции парсинга/smtp. Нужно при остановке скрипта дать функции парсинга/smtp завершиться и остановиться на выдаче очередного url/email, а при повторном запуске начать с точки останова. Подскажите, пожалуйста, как это можно осуществить? Интересуют все возможные теории/названия/библиотеки. Спасибо.
Офлайн
robishoМожно сделать по принципу, который есть у браузеров и программ для закачки. Когда она закачивает, она регистрирует все закачанные части. При её остановке остаются эти файлы, в которых записано то последнее, что закачалось. При новом запуске она ищет эти файлы, в которых записано, что там было до этого запуска, и по ним действует дальше, так же их меняя.
Подскажите, пожалуйста, как это можно осуществить?
robishoПри сигнале остановки программа должна доделать задачу и выйти из-за того, что был получен этот сигнал остановки. Ну, ты получаешь сигнал, устанавливаешь флажок, что был получен сигнал, а в конце цикла этот флажок проверяется.
Нужно при остановке скрипта дать функции парсинга/smtp завершиться и остановиться на выдаче очередного url/email
Отредактировано py.user.next (Дек. 13, 2022 04:25:18)
Офлайн
py.user.nextспасибо за идеи) ну у меня не такая глобальная задача будет, нужно будет просто ставить скрипт на паузу в течении одной сессии терминала или стопить. сохранять состояния, думаю не надо.
цикл for - выдает ссылки: проверка нажатия клавиши P проверка нажатия клавиши S тело функции проверка нажатия клавиши P проверка нажатия клавиши S
[temp+1:]
Отредактировано robisho (Дек. 13, 2022 06:06:53)
Офлайн
robishoКопайте в сторону асинхронного программирования asyncio,
нужно будет просто ставить скрипт на паузу
Онлайн
остановку скрипта можно сделать с помощью модуля msvcrt, отслеживать нажатия клавиш P and S, если S - выходим из скрипта sys.exit(), а если Р - выходим из скрипта sys.exit() с сохранением в файл temp.txt номера использованной строки из файла с линками. следующий запуск скрипта будет начинаться с формирования нового списка линков от temp+1 до конца, если temp.txt не пустой. где могут быть овраги, как считаете?
Офлайн
robishoпочему не асинхронное программирование? Оно как раз для таких случаев.
где могут быть овраги, как считаете?
def my_script(): print('работает скрипт') print('пауза') signal = yield print('скрипт продолжил работу') print(f' еще пришли данные {signal}') print(f'скрипт встал на паузу') yield signal = yield print(f'скрипт снова работает c данными {signal}') script = my_script() while True: try: next(script) s = input('>') script.send(s) except StopIteration: print('скрипт закончил работу') break
работает скрипт
пауза
>t
скрипт продолжил работу
еще пришли данные t
скрипт встал на паузу
>4
скрипт снова работает c данными 4
скрипт закончил работу
Онлайн
xam1816прошу прощения, вы, наверное, не так поняли. скрипт не должен ВСЕГДА ждать next, он должен выполняться по плану, но отслеживать нажатия клавиш Р и S.
lst = [1, 2, 3] def foo(elem): returt elem ** 2 for elem in lst: print(foo(elem))
Офлайн
сырая модель
from pynput.keyboard import Events def gen(): i = 0 while 1: i += 1 yield i def gen_signal(): with Events() as event: while 1: s = event.get(1) if s: if str(s).startswith('Release') and hasattr(s.key, 'char'): yield s.key.char else: yield None def main(): signal = gen_signal() g = gen() f = True while 1: if f: print(next(g)) s = next(signal) if s is not None: if s == 'p': f = not f print('\npause') if not f else print('\ngo') elif s == 's': print('\nbreak') break main()
1
2
3
4
p
pause
p
go
5
6
7
s
break
Process finished with exit code 0
Онлайн
xam1816очень интересно, спасибо, попробую разобраться)
сырая модель
import msvcrt import os def function(elem): return elem ** 2 lst = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] for elem in lst: is_stop = False while True: if not is_stop: print(function(elem)) time.sleep(5) if msvcrt.kbhit(): point = msvcrt.getch() point_ord = ord(point) if point_ord == 112: # p=112 print('Key "p" was pressed!') if not is_stop: is_stop = True print('Основной цикл остановлен') elif is_stop: is_stop = False print('Основной цикл снова запущен') elif point_ord == 115: # s=115 print('Кирдык!') os._exit(1) else: print('Press "P" for pause, "S" for stop') if not is_stop: break
Офлайн
Добрый день. Вопрос такой возник: можно ли в скрипт, что я выложил выше, после print('Основной цикл остановлен') в этом же if, пока скрипт на паузе, вклинить другой код из этой же программы? допустим, я захотел в этой паузе проверить ссылки в файле, который используется в программе, на работоспособность. спасибо.
Офлайн