Задать вопрос

Как поубивать потоки которые я сам же и насоздавал?

Здравствуйте.
Дело такое.
Есть бот для телеграма.

При отправке команды боту, например, /check 192.168.0.1, он создает thread с именем "id отправителя + адрес" (в нашем примере адрес будет 192.168.0.1).
В этом треде бесконечно выполняется цикл, в котором пингуется адрес и результаты отсылаются обратно тому, кто этот thread создал.
Через какое то время, какие то из тредов надо прибить, а какие то оставить.

Соответственно я посылаю команду например /kill 192.168.0.1
и как мне теперь убить thread с именем "id отправителя + адрес"

как получить все активные потоки я понял:
for i in range(threading.active_count()):
               print(threading.enumerate()[i])

а вот что дальше пока не разобрался.

Помогите нубу.

Пример.
рабочий бот по имени TosterQuest_bot
надо сделать pip install pyTelegramBotAPI

import threading, random, time, telebot

bot = telebot.TeleBot('276349923:AAGq2JkAib-OwGo-SrW1lHbh4CTPVFmY0ns')


@bot.message_handler(commands=['cr'])
def handle_text(message):
        param = str(random.randint(1, 1000))
        threadname = str(message.from_user.id) + " " + param
        th = threading.Thread(target=inffync, name=threadname, args=[param])
        th.start()


@bot.message_handler(commands=['list'])
def handle_text(message):
    for i in range(threading.active_count()):
        print(threading.enumerate()[i])


@bot.message_handler(commands=['kill'])
def handle_text(message):
    print("Хочу убивать потоки созданные " + str(message.from_user.id))


def inffync(p):
    while True:
        print(str(random.randint(1, 1000)) + "   " + p)
        time.sleep(5)
bot.polling(none_stop=True, interval=0)


если послать ему команду /cr он создаст тред в котором будет бесконечно выполняться функция которая выводит рандомное число.
если послать /list в консоле появится список запущенных потоков.
вот теперь как оформить убийство одного из них по команде /kill?
  • Вопрос задан
  • 1184 просмотра
Подписаться 1 Оценить Комментировать
Решения вопроса 1
@nirvimel
В цикле проверяется флаг (условие выхода), изначально заданный в False, но сбрасываемый в True обработчиком команды /kill. Удобно использовать dict для соотнесения отдельным потокам флагов выхода.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Olej
@Olej
инженер, программист, преподаватель
Соответственно я посылаю команду

По вашей команде (хотя я не понял кому и как вы подаёте команду?) вам нужно выйти из цикла в потоке и выполнить return потоковой функции.

Здесь поищите:
Python - параллелизм
Тонкости использования языка Python: Часть 4. Пара...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы