Найти - Пользователи
Полная версия: Убить запущенные потоки.
Начало » Python для новичков » Убить запущенные потоки.
1 2
jartasa
Как можно убить все запущенные потоки не дожидаясь окончания какого то действия ?
Каждый поток работает довольно долго из-за скачки по сети, поэтому вызвать исключение или выход из него никак.
Как только в одном из потоков появляется требуем условие, то act становится ‘kill’ и нужно убить все потоки.
Я бы конечно мог убить главный поток, но его убивать нельзя, т.к после этого нужно выполнять ещё кое какие действия.
for i in xrange(count):
threadt = hreading.Thread(target=targ)
thread.start()
while threding.count()>1:
if act=='kill':
########kill all threads####
time.sleep(1);
Андрей Светлов
Неправильная постановка вопроса.
Поток сам должен знать, продолжать ли ему работу или быстро прекратиться.
Например, ждать с таймаутом и проверять свой флажок.
Убивание снаружи невозможно сделать безопасным.
alexx11
jartasa
Я бы конечно мог убить главный поток
Ага убей главный и останутся у тебя зомби. Вообще, ни метод на даже сама постановка задачи в корне не верная.
tmp_a6367100
alexx11
Ага убей главный и останутся у тебя зомби. Вообще, ни метод на даже сама постановка задачи в корне не верная.
впринцепе с учотом оговорок – решение может состоянить именно в убивании главной нити..

почему? потомучто Python принципиально игнорирует возможность ядра-Linux посылать сигналы к неглавным-нитям!

какие условия для убийств нужны? чтобы все побочные нити были ДЕМОНИЧЕСКИМИ, а сама программа чтобы была МУЛЬТИПРОЦЕССНОЙ
alexx11
tmp_a6367100
потомучто Python принципиально игнорирует возможность ядра-Linux посылать сигналы к неглавным-нитям!
Любой поток может общаться друг с другом, при желании ессно.
tmp_a6367100
какие условия для убийств нужны?
никто не говорит что убить нельзя, просто это делают только те кто программирует так же как и пишут - с ошибками.
tmp_a6367100
alexx11
tmp_a6367100
потомучто Python принципиально игнорирует возможность ядра-Linux посылать сигналы к неглавным-нитям!
Любой поток может общаться друг с другом, при желании ессно.
общение – общению разнь !!

при посылке сигнала (ните! что позваляет ядро-Linux) – действие текущей нити прекращается и управление моглобы перейти МГНОВЕННО в функцию, вызывающую исключение в данной ните…

…а далее нить аккуратненько бы завершила своё действие (не забыв выполнить все диструкторы ранее инициализированных переменных)

… но такую возможность СПЕЦИАЛЬНО не включили в Python … только лишь по причине того что посылка сигналов к отдельным нитям – специфична для ядра Linux. и тогдабы Пайтон потерял бы часть кросплатформенности

alexx11
никто не говорит что убить нельзя, просто это делают только те кто программирует так же как и пишут - с ошибками.
не факт что специалисты по гуманитарным наукам (которые НЕ делают ошибок в правописании. вы на них намекаете?) – используют корректные способы программирования. возможно как-раз ИМЕННО ОНИ-ТО вот так и поступают..

вы наверно давно не читали журналистской прессы.. если полагаете что журналисты, филологи, пейсатели, <…> – прям уж так гениальны в праграммировании



…и если уж заговорили про русский язык – то давайте НЕ будем говорить слово “поток” там где подразумевается смысл “нить” .
поток – это #include <stream> в C++

о том как безграмотные журналюги и пейсатели начали говорить слово “поток” – вам расскажет историческая наука в разделе про Microsoft :-/
alexx11
tmp_a6367100
там где подразумевается смысл “нить”
Нитью называют потоки только те кто хотят выделится, и блеснуть знанием английского, вторая волна в журналистике. А тем временем “поток” уже прочно прижился в русском языке, пример многопоточность.
tmp_a6367100
alexx11
написал:

никто не говорит что убить нельзя, просто это делают только те кто программирует так же как и пишут - с ошибками.
не факт что специалисты по гуманитарным наукам (которые НЕ делают ошибок в правописании. вы на них намекаете?) – используют корректные способы программирования
Не факт, только при чём это.

tmp_a6367100
…а далее нить аккуратненько бы завершила своё действие (не забыв выполнить все диструкторы ранее инициализированных переменных)
Ну и самое интересное. Записать, закрыть файлы, сообщить всем пайпам, вскипятить чайник, отправить смс, …и много другое что было в деструкторе. И unix задумался, может не надо было его убивать :) Я сомневаюсь что там блок finally выполнится.
tmp_a6367100
alexx11
… Я сомневаюсь что там блок finally выполнится.
нато оно исключение и нужно, чтобы выполнились все блоки finally :-) :-)


а если блок finally (и деструкторы переменных) – не будут выполнены – то это уже нельзя называть аккуратным завершением :-D


как раз именно поэтому и существуют в ядре-Linux сигналы-для-нитей – чтобы можно было аккуратно завершать нити

…без сигналов-нитей – остаётся только Posix Thread Cancellation – и вот этот-механизм конешно же НЕ является аккаратным
tmp_a6367100
вот видимо нужная системная функция:
http://www.kernel.org/doc/man-pages/online/pages/man2/tkill.2.html

'''
TKILL(2) Linux Programmer's Manual TKILL(2)

NAME

tkill, tgkill - send a signal to a thread



'''

осталось разобраться с регистрацией Обработчика Сигналов внутри убиваемой Нити (чтобы Обработчик указывал на функцию пораждения исключения)

….и можно таким образом состряпать библиотеку для Пайтона, способную корректно_и_безопасно останавливать-и-разгружать Нити


вот только всё это даже не POSIX (не говоря уж о Windows)
alexx11
tmp_a6367100
а если блок finally (и деструкторы переменных) – не будут выполнены – то это уже нельзя называть аккуратным завершением
Уж точно, нельзя! Только это ты себя убеждаешь? =)
А если у тебя тред в дедлоке? Ух блин, ведь скоро 1 сентября.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB