Форум программистов, компьютерный форум, киберфорум
Python: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.69/13: Рейтинг темы: голосов - 13, средняя оценка - 4.69
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
Telegram API

Отключение отдельного потока с bot.polling()

27.03.2023, 04:03. Показов 4017. Ответов 24
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста: Я запустил bot.polling() через отдельный поток с помощью threading

Python
1
2
3
4
import threading
 
proc_bot = threading.Thread(target=bot.polling)
proc_bot.start()
А как теперь этот поток остановить? Кучу статей в интернете пересмотрел, но ничего не работает (и с флагами, и с ивентами). Может, кто-то уже сталкивался с таким и знает, как этот поток приостановить или прервать?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.03.2023, 04:03
Ответы с готовыми решениями:

Никак не получается запустить bot.polling
Пытаюсь разобраться с ботом телеграм, никак не получается запустить bot.polling(none_stop=True, interval = 0) в отдельном потоке(для того...

Падает чат-бот. Проблема с bot.polling()
Здравствуйте! При запуске кода для связи с чат-ботом в Telegram, возникла следующая проблема, которую не получается решить: ...

While True и Bot.Polling должны работать вместе
Добрый вечер! В поисках ответа на этот вопрос уже облазил весь интернет, но результатов нет, очень надеюсь что Вы сможете помочь! ...

24
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.03.2023, 08:03
Fershtein, остановить поток в питоне нельзя. Выкручиваются именно с флагами и ивентами. Или если тот, второй поток-демон, то питон его убьет при остановке текущей программы
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 08:07  [ТС]
Welemir1, В тот-то и беда. При просмотре различных видео-роликов и статей там предлагают добавить флаг или ивент в функцию (которая прописана через def). Но, как я понял, bot.polling сам по себе является функцией. И как туда добавить флаг или ивент - без понятия
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.03.2023, 09:23
я не знаю задачу и потому не могу ничего посоветовать. Если надо просто завершить бота при закрытии программы, то сделай его поток демоном и все. Если же нужно по кнопке стартануть бота и по кнопку убить то это сложнее.
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 09:38  [ТС]
Welemir1, Да, мне нужен второй вариант. То есть бот просто "умирает" по кнопке, а по другой кнопке "оживает". Но сейчас меня интересует именно "приостановка бота"

Добавлено через 4 минуты
Welemir1, В принципе, если есть вариант создать аналог функции bot.polling через def, то тогда можно будет использовать флаг или ивент. Вот можно ли как-то узнать, из чего состоит эта функция bot.polling?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.03.2023, 09:49
Цитата Сообщение от Fershtein Посмотреть сообщение
Вот можно ли как-то узнать, из чего состоит эта функция bot.polling?
конечно, в пичарме нажать контрол и клик по функции или просто посмотреть в документации.
Но на самом деле это не так можно решить а с коленцем:
1) в основном потоке создаем поток демон1
2) в потоке демоне1 также запускаем поток-демон2, в котором и стартуем бот.поллинг
3) в потоке-демоне1 после того как запустился поток-демон2 делаем вечный цикл, где у нас слип на секунду и проверку какого то флага, типа canRun. Если флаг станет ЛОЖЬ то делаем break
4) когда в основном, главном потоке нам надо убить бота (жестоким образом) мы по нажатию кнопки или еще как - ставим флаг canRun=False

как это работает - поток-демон2 работает с поллингом и ни о каких флагах не знает, это нормально. Но тот, кто его породил (демон1) постоянно со слипом в секунду отслеживает флаг и если флаг ложный то завершается. Встроенный механиз питона убьет поток-демон2 потому что его родитель умер. Профит
1
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 10:07  [ТС]
Welemir1, То есть поток1 запускает поток2, который запускает бота. При этом поток1 делает проверку на флаг и умирает, если флаг изменился. Верно уловил суть?
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.03.2023, 10:28
Fershtein, да
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 10:38  [ТС]
Welemir1, Да, бот отключается. За это спасибо. Но теперь возникла другая проблема: не выходя из программы я не могу запустить бота вновь.

Вот есть у меня два класса, которые реализованы в виде окон (pyqt5). У каждого из этих окон есть кнопка "перехода" в другое окно (закрывается текущее окно и создается второе).

Во втором классе запускается телеграм-бот и функция bot.polling (Чтобы работал и бот, и окна, бот запущен в отдельном потоке)

Вот с помощью Вашего метода я сделал так, чтобы при переходе в первое окно (в первый класс) функция bot.polling "прерывалась" (чтобы бот не реагировал на команды). Но при переходе опять во второй класс возникает ошибка, из-за которой бот не запускается (смысл ошибки в том, что у меня бот будто бы уже запущен)

Добавлено через 1 минуту
Конкретная ошибка:

TeleBot: "Threaded polling exception: A request to the Telegram API was unsuccessful. Error code: 409. Description: Conflict: terminated by other getUpdates request; make sure that only one bot instance is running"
0
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,694
Записей в блоге: 29
27.03.2023, 11:34
Fershtein, я бы сейчас пошел читать доку самого бота, уверен там есть флаги и всякие способы им управлять
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 12:00  [ТС]
Welemir1, Все-таки я думаю, что ошибка возникает именно за счет "убивания" потока. В том плане после завершения потока можем ли мы его снова создать?
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
27.03.2023, 12:57
Как правило, вещи на подобии bot.polling() внутри сами запускают отдельный поток и всю свою логику отрабатывают в этом отдельном потоке. Возможно при закрытии внешнего потока, сам bot.polling() продолжает крутиться.
Если правильно угадал и используется библиотека telebot, то у него есть метод stop_polling(), его нужно вызывать при закрытии внешнего потока.
1
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 13:31  [ТС]
kazak,
Цитата Сообщение от kazak Посмотреть сообщение
Как правило, вещи на подобии bot.polling() внутри сами запускают отдельный поток и всю свою логику отрабатывают в этом отдельном потоке.
А вот нет, как оказалось. При работе bot.polling другие процессы "зависают", ожидая завершения bot.polling

А насчет stop_polling() я посмотрю, только не совсем понял, куда его пихнуть: Вы имеете в виду засунуть его в бесконечный цикл, где осуществляется проверка флага?

Добавлено через 52 секунды
Цитата Сообщение от kazak Посмотреть сообщение
продолжает крутиться.
Но на самом деле нет, он не крутится. Я проверяю его отправкам сообщений в самой телеге - бот не реагирует

Добавлено через 1 минуту
Как вариант думаю создать этот отдельный поток вне классов. Может это что-то даст
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
27.03.2023, 14:19
Тогда все должно быть проще, достаточно вызвать stop_polling, если polling единственный метод работающий в потоке, то после остановки polling закроется и поток.
Цитата Сообщение от Fershtein Посмотреть сообщение
только не совсем понял, куда его пихнуть
stop_polling нужно вызывать в тот момент, когда есть необходимость завершить работу proc_bot.
1
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 14:53  [ТС]
kazak,
Цитата Сообщение от kazak Посмотреть сообщение
stop_polling нужно вызывать в тот момент, когда есть необходимость завершить работу proc_bot.
Ок, сделал. Бот закрывается, при повторном открытии потом ошибок не происходит. Однако сам бот теперь не запускается. Для повторного запуска приходится полностью закрывать программу со всеми потоками

Добавлено через 3 минуты
Python
1
2
3
4
5
6
7
8
9
10
11
        
        def proc_bot():
            threading.Thread(target=bot.polling, daemon=True).start()
            while True:
                time.sleep(1)
                if stop_thread is True:
                    bot.stop_polling()
 
 
        proc_bot1 = threading.Thread(target=proc_bot, daemon=True)
        proc_bot1.start()

stop_thread у меня в классе присвоено False.

После нажатия кнопки, выполняется функция, в которой значение stop_thread становится True и бот заканчивает свою работу и происходит переход в другой класс. А при возвращении в класс, где прописан участок кода выше, ошибки нет, но и сам бот попросту не запускается
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
27.03.2023, 14:53
stop_bot вместо stop_polling попробуйте.
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 17:27  [ТС]
kazak,
Цитата Сообщение от kazak Посмотреть сообщение
stop_bot вместо stop_polling попробуйте.
Вернулась старая ошибка, где я пытаюсь запустить уже запущенный бот, хотя он "не крутится" при проверке командами

Добавлено через 2 часа 21 минуту
kazak, А есть ли возможность создать просто класс QThread? (Просто у этого класса, насколько я понял, есть метод run и stop. Может так выгорит?
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
27.03.2023, 17:54
Попробуйте вернуть stop_polling и при создании бота передавать параметр threaded=False.
У меня аналогично, при создании бота по умолчанию, повторный polling запускается, получает сообщения, но обрабатывать их почему-то не хочет. С threaded=False все ок.
0
4 / 4 / 0
Регистрация: 07.03.2019
Сообщений: 249
27.03.2023, 18:23  [ТС]
kazak,
Цитата Сообщение от kazak Посмотреть сообщение
threaded=False
А куда именно это нужно подать? Ни разу просто не видел этот параметр

Добавлено через 8 минут
Если этот параметр ставится в функцию с демоническими потоками, то, пожалуйста, укажите мне строку, куда это надо пихнуть
0
 Аватар для kazak
3604 / 2744 / 356
Регистрация: 11.03.2009
Сообщений: 6,307
27.03.2023, 18:31
Python
1
bot = telebot.TeleBot(API_TOKEN, threaded=False)
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
27.03.2023, 18:31
Помогаю со студенческими работами здесь

подскажите что такое long-polling и polling (COMET)
Привет.Знаком с AJAX, WEBSOCKETS,но не знаю что такое long-polling и polling. Подскажите примеры.Буду очень благодарен.

Изменение ImageView из отдельного потока
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...

Скриншот формы из отдельного потока
Подскажите, нужно получить Form1 из другого потока, как изменять texbox'ы и т.д из потоков я знаю, а как получить Form1? Добавлено...

Доступ к SWING из отдельного потока
Привет. Прочитал массу инфы, но ответа так и не нашел/не понял. вот форма сгенерина в netbeans. Form.java public class Form...

Signal Slot из отдельного потока в основной
Доброго времени суток. Имеется QTreadPool. Имеется свой Runnable с методом run. Внутри есть сигнал signals: void...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru