скорее всего проблема заключается в том, что вы, вероятно, запускаете процесс парсинга в одном потоке, а управление флажком — в другом. Чтобы решение работало корректно, вам действительно стоит рассмотреть использование многопоточности или асинхронной обработки.
Вот несколько вариантов решения вашей проблемы:
### 1. Многопоточность
Вы можете использовать модуль threading, чтобы запустить парсер в отдельном потоке. В таком случае основной поток будет отслеживать команды пользователя, а дополнительный поток будет заниматься парсингом.
Примерный код мог бы выглядеть следующим образом:
import threading
# Флаг для остановки парсинга
stop_flag = False
def start_parsing():
global stop_flag
# Ваш код парсинга
while not stop_flag:
print("Парсим данные...")
# Здесь идет ваш парсинг
# Если флажок установлен, останавливаем парсинг и отправляем результат
if stop_flag:
send_excel_file()
def handle_commands():
global stop_flag
# Ваш код для обработки команд пользователя
command = input("Введите команду: ")
if command == "/стоп":
stop_flag = True
print("Остановка парсинга...")
if __name__ == "__main__":
parsing_thread = threading.Thread(target=start_parsing)
parsing_thread.start()
handle_commands()
Здесь start_parsing выполняется в отдельном потоке, а основной поток отслеживает ввод команд от пользователя.
### 2. Асинхронная обработка (asyncio)
Если вы используете библиотеку aiogram или любую другую библиотеку для работы с Telegram API, то, скорее всего, она поддерживает асинхронную обработку. Вы можете воспользоваться модулем asyncio для запуска параллельных задач.
Примерный код с использованием asyncio:
import asyncio
# Флаг для остановки парсинга
stop_flag = False
async def start_parsing():
global stop_flag
# Ваш код парсинга
while not stop_flag:
await asyncio.sleep(0.1) # Задержка между итерациями
print("Парсим данные...")
# Здесь идет ваш парсинг
# Если флажок установлен, останавливаем парсинг и отправляем результат
if stop_flag:
await send_excel_file()
async def handle_commands(bot):
global stop_flag
@bot.message_handler(commands=['стоп'])
async def stop_command(message):
global stop_flag
stop_flag = True
await bot.send_message(message.chat.id, "Остановка парсинга...")
if __name__ == "__main__":
loop = asyncio.get_event_loop()
loop.run _until_complete(start_parsing())
loop.close()
Этот подход позволит вам одновременно обрабатывать команды пользователя и выполнять парсинг.
Заключение
В вашем случае лучше использовать многопоточность или асинхронность, чтобы обеспечить правильную работу вашего бота. Оба подхода позволят вам управлять процессом парсинга и реагировать на команды пользователя в режиме реального времени.