Найти - Пользователи
Полная версия: Принудительное завершение потока
Начало » Network » Принудительное завершение потока
1 2
spirits25
Всем доброго времени.
Проблема вот в чём, необходимо иметь возможность принудительно закрыть поток.
Например, имеем:

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

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

Спасибо.
regall
Поток извне убить нельзя. Выставляйте какой-нибудь флаг, который поток внутри будет проверять и в случае его установки - закроется.
spirits25
функция func выполняет большую, долгую однодискретную (флаги завершения читать не может) операцию
А если поток завис? или пошёл сбой и он идёт не так и не может флаг читать?
Вот уже 3 варианта, когда стоило бы предусмотреть аварийное прерывание со стороны “предка”. Неужели нет способа?
pill
А если поток завис то разработчик… неправ :).
Функцию нужно переписывать.
spirits25
хорошо, поток заключается в форматировании диска, причём средствами ос. запускается форматирование и пока не закончит флаг не прочитает. Как прерываем?
o7412369815963
spirits25
хорошо, поток заключается в форматировании диска, причём средствами ос. запускается форматирование и пока не закончит флаг не прочитает. Как прерываем?
1) Использовать неблокирующие методы.
2) Вынести обработку в отдельный процесс, его можно убить по ид.
хотя мне кажется был какой-то читерский метод прерывания потока, когда я с этим разбирался, но уже забыл все т.к. это не тру путь.

+ ещё вопрос - оборвать поток или оборвать поток и остановить форматирование?
spirits25
хм…)) а смысл обрывать поток, если форматирование как то не оборвётся? нужно чтобы файлики перестали исчезать.
o7412369815963
Вынести обработку в отдельный процесс
Это сейчас и делаю=)
o7412369815963
кстати, зачем форматирование в отдельный поток? пул многопоточного форматирования?

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

а в линуксе я бы делал форматирование вызовом специализированной nix-овой утилиты через subprocess, он имеет неблокирующий методы взаимодействия.
spirits25
o7412369815963
зачем форматирование в отдельный поток
это просто пример.
o7412369815963
специализированной nix-овой утилиты
какой именно?
o7412369815963
spirits25
o7412369815963
специализированной nix-овой утилиты
какой именно?
ну для форматирования например mkfs, и ничего дополнительно к питону ставить не надо
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