У меня есть поток, который содержит выполнение IronPython script. По какой-то причине мне может понадобиться остановить этот поток в любое время, включая script выполнение. Как достичь этого? Первая идея Thread.Abort()
, но она известна как зло...
Что такое безопасный способ остановить поток?
Ответ 1
Ну и у вас вопрос и последующие комментарии я могу предложить вам два варианта, с некоторыми дополнительными "предупреждениями":
-
Если ваша нить выполняет что-то на каждой итерации, вы можете установить волатированный логический флаг таким образом, чтобы он выходил после завершения текущей итерации (псевдокод, потому что я не знаком с python):
while shouldExit = false // do stuff
Затем просто установите флаг
true
, когда вы хотите остановить поток, и он остановится при следующем проверке условия. -
Если вы не можете дождаться завершения итерации и немедленно ее остановить, вы можете пойти за
Thread.Abort
, но убедитесь, что вы не можете оставить открытые файлы, сокеты, блокировки или что-нибудь еще подобное в несогласованном состоянии.
Ответ 2
Что такое безопасный способ остановить текущий поток?
Поместите поток в свой собственный процесс. Когда вы хотите, чтобы он остановился, убить процесс.
Это единственный безопасный способ убить поток. Отмена потока может серьезно дестабилизировать процесс и потерять пользовательские данные. Нет никакого способа избежать сценария "потерять пользовательские данные", если вы действительно действительно должны иметь возможность убивать поток, который может что-то делать. Единственный способ избежать дестабилизации процесса, требующего прерывания, - сделать их разными процессами полностью.