Repository navigation
[BUG]: Зависание графического интерфейса и невозможность остановить парсер кнопкой «Стоп» #326
Description
ОС
Windows 11
Версия парсера
v3.2.22
Способ запуска
Python (venv)
Текст ошибки
Проблема:
После нажатия на кнопку «Старт» окно приложения Flet (AvitoParser.py) полностью замерзает и перестает отвечать на действия пользователя (в заголовке Windows появляется статус «Не отвечает»). Кнопка «Стоп» визуально не нажимается, а остановить парсинг штатным способом невозможно.
Причина в коде AvitoParser.py:
-
Обработчик start_parser(e) (строка ~235) выполняется в главном потоке обработки событий Flet.
-
В цикле while is_run: вызывается run_process(), в котором создается поток парсинга и тут же блокируется методом .join():
parsing_thread = threading.Thread(target=parser.parse)
parsing_thread.start()
parsing_thread.join() # <--- Блокирует главный цикл событий интерфейса -
После завершения прохода ссылки выполняется цикл ожидания паузы через синхронный 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
fix: address filter crash, Excel export with None fields, and GUI freeze