Прерывание и повторный запуск скрипта

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Задача такая: при работе скрипта нужно его остановить, а затем продолжить выполнение с того же места остановки. Например, при парсинге или массовой отправки сообщений smtp. Т.е. структура, я думаю, будет такая: из списка берется url или email и обрабатывается в функции парсинга/smtp. Нужно при остановке скрипта дать функции парсинга/smtp завершиться и остановиться на выдаче очередного url/email, а при повторном запуске начать с точки останова. Подскажите, пожалуйста, как это можно осуществить? Интересуют все возможные теории/названия/библиотеки. Спасибо.
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
не, так не пойдет.
Кто сказал?

Python:
import keyboard
import time
import threading


def func():
    global stop
    while 1:
        if stop:
            print('Тут работает основной цикл')
        time.sleep(1)


stop = 1
threading.Thread(target=func, daemon=True).start()

while 1:
    keyboard.wait("p")
    print('key "p" was pressed! Основной цикл', 'остановлен' if stop else 'снова запущен')
    stop ^= 1

Правда тут получается, что если основной цикл тратит на одну итерацию много врмени, то нажатие на р остановит цикл только когда закончится итерация.
 
Последнее редактирование:
  • Мне нравится
Реакции: robisho

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
можно ли к этому прикрутить нажатие на клавишу S и по ней sys.exit() ?
Можно
Python:
from keyboard import is_pressed
import time
import threading
import sys


def func():
    global stop
    while 1:
        if stop:
            print('Тут работает основной цикл')
        time.sleep(1)


stop = 1
threading.Thread(target=func, daemon=True).start()

while 1:
    if is_pressed('s'):
        print('Завершение программы')
        sys.exit()

    if is_pressed('p'):
        while is_pressed('p'):
            time.sleep(.05)
        print('key "p" was pressed! Основной цикл', 'остановлен' if stop else 'снова запущен')
        stop ^= 1

    time.sleep(.05)

тому же stop ^= 1 я бы сам не сочинил, ибо что это и как работает?
Это самый обычный переключатель оператором xor. 1 0 1 0 и т.д)
 
  • Мне нравится
Реакции: robisho

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
Почему не хочешь использовать обычную функцию sleep() из модуля time?
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Почему не хочешь использовать обычную функцию sleep() из модуля time?
ну дык в sleep() нужно время передавать, а мне нужно ждать нажатия, например, клавиши Р, чтобы снова запустить. как это с модулем time поженить не нашел) придумал вот что. остановку скрипта сделать с модулем msvcrt, там можно клавиши задавать. выход по клавише sys.exit(), перед этим сохранять номер линка из списка рабочего в файл temp.txt. а следующий запуск начинать с формирования нового рабочего списка, если temp.txt не пустой. навскидку не видно, где запнусь?)
 

4olshoy_blen

Популярный
Пользователь
Ноя 13, 2022
423
115
43
Python:
import keyboard

keyboard.wait("p")  # Ожидает нажатия "p"
print('Key "p" was pressed!')
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Python:
import keyboard

keyboard.wait("p")  # Ожидает нажатия "p"
print('Key "p" was pressed!')
не, так не пойдет. это же в цикле будет, и цикл будет продолжаться только по нажатию Р, а мне нужно чтобы цикл крутился, но когда нажата Р - остановился. и, в идеале, когда снова нажата Р - начался с того же места)
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Кто сказал?

Python:
import keyboard
import time
import threading


def func():
    global stop
    while 1:
        if stop:
            print('Тут работает основной цикл')
        time.sleep(1)


stop = 1
threading.Thread(target=func, daemon=True).start()

while 1:
    keyboard.wait("p")
    print('key "p" was pressed! Основной цикл', 'остановлен' if stop else 'снова запущен')
    stop ^= 1

Правда тут получается, что если основной цикл тратит на одну итерацию много врмени, то нажатие на р остановит цикл только когда закончится итерация.
действительно, работает) спсб) я думал про threading, но до него не дошел. к тому же stop ^= 1 я бы сам не сочинил, ибо что это и как работает? и ещё, можно ли к этому прикрутить нажатие на клавишу S и по ней sys.exit() ?
 

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
много нового узнал и решение красивое) спасибо большое)
 
  • Мне нравится
Реакции: 4olshoy_blen

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
в общем получилось уот так уот)
Python:
import os
import msvcrt

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:  # ESC=27  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

всё это действо я оформил декоратором для function(elem), теперь можно любую функцию везде, где хочешь, наряжать) отдельное спасибо комраду 4olshoy_blen
 
Последнее редактирование:

robisho

Активный пользователь
Пользователь
Окт 19, 2020
151
26
28
Добрый день. Вопрос такой возник: можно ли в скрипт, что я выложил выше, после print('Основной цикл остановлен') в этом же if, пока скрипт на паузе, вклинить другой код из этой же программы? допустим, я захотел в этой паузе проверить ссылки в файле, который используется в программе, на работоспособность. спасибо.
 

Форум IT Специалистов