Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 5, 2011 17:07:28

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Принудительное завершение потока

Всем доброго времени.
Проблема вот в чём, необходимо иметь возможность принудительно закрыть поток.
Например, имеем:

t = threading.Thread(target=func, args = (name, other))
t.start()

но функция func выполняет большую, долгую однодискретную (флаги завершения читать не может) операцию. Как его принудительно убить?

Спасибо.



Офлайн

#2 Окт. 5, 2011 20:35:07

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Принудительное завершение потока

Поток извне убить нельзя. Выставляйте какой-нибудь флаг, который поток внутри будет проверять и в случае его установки - закроется.



Офлайн

#3 Окт. 6, 2011 08:12:57

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Принудительное завершение потока

функция func выполняет большую, долгую однодискретную (флаги завершения читать не может) операцию
А если поток завис? или пошёл сбой и он идёт не так и не может флаг читать?
Вот уже 3 варианта, когда стоило бы предусмотреть аварийное прерывание со стороны “предка”. Неужели нет способа?



Офлайн

#4 Окт. 6, 2011 09:36:06

pill
От:
Зарегистрирован: 2010-08-27
Сообщения: 223
Репутация: +  0  -
Профиль   Отправить e-mail  

Принудительное завершение потока

А если поток завис то разработчик… неправ :).
Функцию нужно переписывать.



Офлайн

#5 Окт. 6, 2011 09:49:24

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Принудительное завершение потока

хорошо, поток заключается в форматировании диска, причём средствами ос. запускается форматирование и пока не закончит флаг не прочитает. Как прерываем?



Офлайн

#6 Окт. 6, 2011 11:13:33

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Принудительное завершение потока

spirits25
хорошо, поток заключается в форматировании диска, причём средствами ос. запускается форматирование и пока не закончит флаг не прочитает. Как прерываем?
1) Использовать неблокирующие методы.
2) Вынести обработку в отдельный процесс, его можно убить по ид.
хотя мне кажется был какой-то читерский метод прерывания потока, когда я с этим разбирался, но уже забыл все т.к. это не тру путь.

+ ещё вопрос - оборвать поток или оборвать поток и остановить форматирование?

Офлайн

#7 Окт. 6, 2011 11:27:57

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Принудительное завершение потока

хм…)) а смысл обрывать поток, если форматирование как то не оборвётся? нужно чтобы файлики перестали исчезать.

o7412369815963
Вынести обработку в отдельный процесс
Это сейчас и делаю=)



Офлайн

#8 Окт. 6, 2011 13:39:59

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Принудительное завершение потока

кстати, зачем форматирование в отдельный поток? пул многопоточного форматирования?

если блокирующий метод будет в основном потоке, то прервать его можно через сигналы http://docs.python.org/library/signal.html

а в линуксе я бы делал форматирование вызовом специализированной nix-овой утилиты через subprocess, он имеет неблокирующий методы взаимодействия.

Офлайн

#9 Окт. 6, 2011 14:15:01

spirits25
От:
Зарегистрирован: 2011-09-29
Сообщения: 18
Репутация: +  0  -
Профиль   Отправить e-mail  

Принудительное завершение потока

o7412369815963
зачем форматирование в отдельный поток
это просто пример.
o7412369815963
специализированной nix-овой утилиты
какой именно?



Офлайн

#10 Окт. 6, 2011 17:37:54

o7412369815963
От:
Зарегистрирован: 2009-06-17
Сообщения: 1986
Репутация: +  32  -
Профиль   Отправить e-mail  

Принудительное завершение потока

spirits25
o7412369815963
специализированной nix-овой утилиты
какой именно?
ну для форматирования например mkfs, и ничего дополнительно к питону ставить не надо

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version