Skip to content

[BUG]: Зависание графического интерфейса и невозможность остановить парсер кнопкой «Стоп» #326

Closed

Description

@eminsk

ОС

Windows 11

Версия парсера

v3.2.22

Способ запуска

Python (venv)

Текст ошибки

Проблема:
После нажатия на кнопку «Старт» окно приложения Flet (AvitoParser.py) полностью замерзает и перестает отвечать на действия пользователя (в заголовке Windows появляется статус «Не отвечает»). Кнопка «Стоп» визуально не нажимается, а остановить парсинг штатным способом невозможно.

Причина в коде AvitoParser.py:

  1. Обработчик start_parser(e) (строка ~235) выполняется в главном потоке обработки событий Flet.

  2. В цикле while is_run: вызывается run_process(), в котором создается поток парсинга и тут же блокируется методом .join():
    parsing_thread = threading.Thread(target=parser.parse)
    parsing_thread.start()
    parsing_thread.join() # <--- Блокирует главный цикл событий интерфейса

  3. После завершения прохода ссылки выполняется цикл ожидания паузы через синхронный time.sleep:
    for _ in range(int(pause_general.value if pause_general.value else 300)):
    time.sleep(1) # <--- Продолжает блокировать поток интерфейса

Так как поток интерфейса занят ожиданием .join() и time.sleep(), события клика мыши по кнопке «Стоп» (stop_parser) не доходят до обработчика.

Дополнительный баг в parser_cls.py (строка 224):
if self.config.one_time_start:
self.stop_event = True # <--- Перезаписывает объект threading.Event на boolean!
Это приводит к тому, что при последующих проверках self.stop_event.is_set() падает с AttributeError: 'bool' object has no attribute 'is_set', а на исходном объекте threading.Event метод .set() так и не вызывается.

Предлагаемое решение:
Вынести рабочий цикл из start_parser в отдельный фоновый поток (Worker Thread), чтобы главный UI-поток Flet оставался свободным и сразу обрабатывал клик по кнопке «Стоп»:

def start_parser(e):
nonlocal is_run
result_proxy = check_string()
result_own_cookies = check_own_cookies()
if not result_proxy or not result_own_cookies:
return
logger.info("Старт")
stop_event.clear()
save_config()
console_widget.height = 700
start_btn.visible = False
stop_btn.visible = True
is_run = True
page.update()

def worker():
    nonlocal is_run
    while is_run and not stop_event.is_set():
        config = load_avito_config("config.toml")
        parser = AvitoParse(config, stop_event=stop_event)
        parser.parse()

        if not is_run or stop_event.is_set():
            break

        logger.info("Пауза между повторами")
        for _ in range(int(pause_general.value if pause_general.value else 300)):
            if not is_run or stop_event.is_set():
                break
            time.sleep(1)

    start_btn.visible = True
    stop_btn.visible = False
    is_run = False
    page.update()

threading.Thread(target=worker, daemon=True).start()

Логи

2026-09-04 14:20:00.100 | INFO | AvitoParser:start_parser:241 - Старт
2026-09-04 14:20:01.200 | INFO | parser_cls:parse:164 - page=1
2026-09-04 14:20:05.500 | INFO | parser_cls:parse:206 - Пауза 5 сек.

Интерфейс зависает, клики по кнопке "Стоп" игнорируются операционной системой

В диспетчере задач статус окна: "Не отвечает" (Not Responding)

Конфиг

[avito]
tg_token = ""
tg_chat_id = []
vk_token = ""
vk_user_id = []
urls = [
"https://www.avito.ru/all/gruzoviki_i_spetstehnika/buldozery-ASgBAgICAURU3E0?cd=1"
]
count = 2
keys_word_white_list = []
keys_word_black_list = []
seller_black_list = []
max_price = 99999999
min_price = 0
geo = ""
proxy_string = ""
proxy_change_url = ""
pause_general = 60
pause_between_links = 5
max_age = 0
max_count_of_retry = 5
ignore_reserv = true
ignore_promotion = false
one_time_start = false
one_file_for_link = false
parse_views = false
save_xlsx = true

Activity

  1. added a commit that references this issue on Sep 4, 2026
    62bfaed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions