Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Флажки True/False в пайтон

лев смульский Ученик (49), на голосовании 2 недели назад
Всем привет. Возникла проблема. Я пишу тг бота на пайтон - его задача по команде начать парсинг неких сайтов и потом скинуть екзель файл мне в телеграме. Бот все делает хорошо, но осталось реализовать последнюю вещь. Мне нужно что бы по команде /стоп бот прекращал парсинг и скидывал екзкль файл тот, что он уже занёс в не. Я подумал поставить флажки, и они работают, но бот во время парсинга не видит что переменная с флажками изменилась. Мне что реализовывать многопоточность?
Голосование за лучший ответ
artem ka Ученик (134) 1 месяц назад
threading.
artem kaУченик (134) 1 месяц назад
Этот модуль предоставляет множество функций и инструментов для управления потоками, позволяя создавать, запускать и управлять ими в приложениях
Ростислав Маркевич Знаток (261) 1 месяц назад
скорее всего проблема заключается в том, что вы, вероятно, запускаете процесс парсинга в одном потоке, а управление флажком — в другом. Чтобы решение работало корректно, вам действительно стоит рассмотреть использование многопоточности или асинхронной обработки.

Вот несколько вариантов решения вашей проблемы:

### 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()


Этот подход позволит вам одновременно обрабатывать команды пользователя и выполнять парсинг.

Заключение
В вашем случае лучше использовать многопоточность или асинхронность, чтобы обеспечить правильную работу вашего бота. Оба подхода позволят вам управлять процессом парсинга и реагировать на команды пользователя в режиме реального времени.
Похожие вопросы