Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.70/64: Рейтинг темы: голосов - 64, средняя оценка - 4.70
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501

Необходимо завершить поток по названию

27.07.2019, 14:33. Показов 13391. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача проста, но ответ искал и не нашел
Запускаю поток
Potok = Thread(target=tgbot.Do ,name = str(tgbot.chatid))
Potok.start

дальше поток работает, я "иду рублю деревья, чилю и тд", прихожу и мне надо остановить этот поток, у потока есть имя, которое я дал, вот как остановить именно тот поток что мне нужен?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
27.07.2019, 14:33
Ответы с готовыми решениями:

Завершить поток по таймауту
В программе создается поток. Если он не отработал за 60 секунд, его нужно принудительно завершить. Способ не важен, хоть Exception. Можно...

Завершить поток while
Всем привет. Суть такова. Запретить вход пользователю в диспетчер задач. Отлавливаю горячие клавиши вне формы. Как только нажимаю F5...

Завершить поток
Здравствуйте. подскажите, как правильно остановить и завершить поток. В приложении WPF в одной кнопке выполняется следующий код ...

10
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.07.2019, 18:06
Цитата Сообщение от Valimer Посмотреть сообщение
у потока есть имя, которое я дал
И у него есть атрибут .name
Цитата Сообщение от Valimer Посмотреть сообщение
Задача проста,
Документацию по therading пробовал читать?
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
27.07.2019, 19:22  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Документацию по therading пробовал читать?
напишите лучше ответ на конкретный вопрос, я уже написал что читал и не нашел ответ на свой вопросы
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.07.2019, 19:35
Цитата Сообщение от Valimer Посмотреть сообщение
я уже написал что читал
Документацию?

Добавлено через 21 секунду
Цитата Сообщение от Valimer Посмотреть сообщение
напишите лучше ответ на конкретный вопрос,
Я написал.
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
27.07.2019, 20:01  [ТС]
господи, или отвечайте или не пишите, куча бесполезных комментов, которые ни о чем.
1
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.07.2019, 20:02
P.S. Кстати, забыл добавить: потоки вообще не завершают - они должны завершиться самостоятельно.
Это, если ты не в курсе.
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
27.07.2019, 20:29  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Это, если ты не в курсе.
убить процесс можно?

Добавлено через 31 секунду
поток*
или войти в него как-то? или присвоить ему свойство после запуска?

Добавлено через 10 минут
моя схема проста - веб хук телеграм бот

/старт - запустился поток с именем чата
/стоп - остановился
если потом запущен, новый не запускается, вот мне надо реализовать /стоп
в потоке бесконечный цикл While True: в котором выполняются некие действия
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
27.07.2019, 23:17
Цитата Сообщение от Valimer Посмотреть сообщение
убить процесс можно?
Процесс - да.
Поток - нет. Лицензия на убийство потоков есть только у ОС. Все другие способы - незаконны и караются изгнанием за Стену.
Однако поток можно уведомить, чтобы он прекратил работу.
Простая схема для уведомления 10 запущенных потоков, что пора бы им позавершаться.

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
import threading
import sys
import time
 
 
def worker(finished):
    x = 0
    name = threading.current_thread().name
    # работаем пока нам не намекнули что пора...
    while True:
        # проверяем установку флага для wait
        if finished.is_set():
            # что-то делаем для корректного завершения
            # освобождаем ресурсы, закрываем файлы и т.д.
            
            print("Работа прервана. Сворачиваемся.",name,flush=True)
            return
        
        #print(x)
        # имитируем работу потока
        time.sleep(3)
        x += 1
        
        # дополнительное условие для нормального завершения потока
        if x > 10:
            # что-то делаем
            break
    
    print('Нормальный конец работы',name)
    # уведомляем wait что можно больше не блокировать основной поток
    # а так как основной поток после wait ничего не делает - программа завершается 
    finished.set()
    
    
def killer(finished):
    '''убийца потоков...на самом деле всего лишь уведомитель'''
    
    while True:
        if finished.is_set():
            print('Killer finished')
            return
        try:
            message = input(">>")
            # если написали в консоль exit
            if message == 'exit': 
                name = input("[EXIT] Введите имя потока:\n")
                # уведомляем рабочий поток, что пора закругляться
                try:
                    threads[name][0].set()
                except KeyError:
                    pass
        except KeyboardInterrupt:
            # чтобы нельзя было завершить по Ctrl+C - иначе без этого потока
            # все остальные останутся неуправляемыми
            pass  
        
                   
def main():    
    
    main_fin = threading.Event()
    killer_fin = threading.Event()
    
    killer_t = None
    
    '''
    # этот поток будет демоном, когда завершится недемонический рабочий поток 
    # он помрет сам... да и пофиг, все равно ничего серьзного не делал :-) 
    killer_t = threading.Thread(
        target=killer,
        daemon=True,
        name="killer", 
        args=[killer_fin]
    )
    '''
    killer_t = killer_t or threading.current_thread()
    threads['killer'] = (killer_fin,killer_t) 
    # создаем 10 рабочих лошадок 
    # они будут обычными, 
    # тогда мы получим возможность их уведомить о необходимости завершения
    # и они смогут произвести предварительные действия перед завершением
    for i in range(10):
        event = threading.Event()
        t_name = str(i)
        p2 = threading.Thread(
            target=worker,
            daemon=False, # не демон!
            name=t_name, 
            args=[event]
        )
        
        # коллекционируем потоки и события
        threads[t_name] = (event,p2) 
    
    # стартуем
    for _,p in threads.values():    
        if not p.is_alive():
            p.start()
    
    #ждем... или не ждем
    #for _,p in threads.values():
    #   p.join()
    
    #  можно запускать киллера в основном потоке либо в отдельном потоке-демоне
    killer(killer_fin) 
    
    # ожидаем завершения основного рабочего потока
    #main_fin.wait()  
    # если не ждем - после отработки все потоков-не-демонов программа завершается
    # если killer не демон, то программа остается работать, пока не уведомить 
    # функцию killer о необходимости завершиться. 
    
    
if __name__ == "__main__":
    threads = {}
    main()

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
>>exit
[EXIT] Введите имя потока:
0
>>Работа прервана. Сворачиваемся. 0
exit
[EXIT] Введите имя потока:
1
>>Работа прервана. Сворачиваемся. 1
exit
[EXIT] Введите имя потока:
2
>>exit
[EXIT] Введите имя потока:
Работа прервана. Сворачиваемся. 2
3
>>Работа прервана. Сворачиваемся. 3
Нормальный конец работы 5
Нормальный конец работы 6
Нормальный конец работы 7
Нормальный конец работы 9
Нормальный конец работы 8
Нормальный конец работы 4
exit
[EXIT] Введите имя потока:
killer
Killer finished
P.S. ТС, где восторженные смайлы и возгласы, что проблема решена? Или и это не ответ на конкретный вопрос? И опять нужно все расжевать?
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
27.07.2019, 23:42  [ТС]
увы мне это не помогло
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.07.2019, 00:20
Цитата Сообщение от Valimer Посмотреть сообщение
увы мне это не помогло
Значит у тебя изначально неправильная архитектура приложения и манипуляции с потоками тут были излишни, либо требовалось что-то совсем иное нежели завершение потоков.
Типичная проблема топиктстартера - X, Y, Z: хочу X через Y, Z не предлагать. А в реальности нужно вообще S.
0
7 / 6 / 1
Регистрация: 29.03.2015
Сообщений: 501
30.07.2019, 12:26  [ТС]
Задача сложна и проста одновременно

Если в чат телеграмма написали Старт, то запускается поток ... Он пошел на работу делает что-то... Скрипт сам по себе работает, обрабатывает сообщения других пользователей, пока поток на работе, потом если с этого чата пришло сообщение /стоп, то наш поток должен остановиться, а вот как это сделать пока ума не дам... обрабатывать сообщения в потоке не получается ...

Пытаюсь сделать что-то типа return threading.enumerate(), if там найден наш поток, тогда его надо как-то вырубить, а вот как именно не знаю

Добавлено через 2 минуты
Была идея создавать глобальные переменные именем ChatID, через exec, типа как динамические переменные, а потом присваивать при надобности им значение False и поток при проверке значения ChatID узнавал что поменялось и завершал работу... Но тоже не могу дать ума как это сделать, потому что надо же сначала получить значение переменной типа

Def get_chatId(message):
chatId = message.chat.id
exec(chatId+'=True')

Добавлено через 1 час 49 минут
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
   
...
    Working = [[],[]]
...
            tgbot().Working[0].append(tgbot().chatid)
            tgbot().Working[1].append(False)
...
 
 @bot.message_handler(commands=['стоп'])
    def status(message):
        print(tgbot().Working)
        print(message.chat.id)
        if message.chat.id in tgbot().Working:
            print('nice')
        else:
            print('bad')

выводит это

[['360233426'], [False]]
360233426
bad

Почему так?

Сама цель -

Python
1
2
3
4
    def Do(ok=False):
        while tgbot().Working[1][tgbot().Working[0].index(tgbot().chatid)] == False:
            print('123')
            sleep(5)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.07.2019, 12:26
Помогаю со студенческими работами здесь

Как завершить поток?
Проблема в том, что создается поток, который нужно завершить нажатием кнопки public void button1_Click(object sender, EventArgs e) ...

Завершить поток изнутри
можно ли в методе run() завершить выполнение этого потока? NetBeans выдает предупреждение, что метода stop() - устарел. И когда создаю...

Как завершить поток
Как завершить поток, начатый _beginthread( Thread, 0, NULL );

Правильно завершить поток
Здравствуйте!!! Делаю программу через поток. Вот код #include <vcl.h> #pragma hdrstop #include "UTime1.h" ...

Правильно завершить поток
Прошу помощи людей, хорошо разбирающихся в многопоточности. Из-за зависания формы приложения во время долгого выполнения (не отвечают...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru