Tengo un hilo que contiene la ejecución de un script IronPython. Por alguna razón, es posible que deba detener este hilo en cualquier momento, incluida la ejecución del script. ¿Cómo lograr esto? La primera idea es Thread.Abort()
, pero se sabe que es malo ...¿Cuál es una forma segura de detener un hilo en ejecución?
Respuesta
bien de usted pregunta y los comentarios posteriores que se puede sugerir dos opciones, con algunas "advertencias" adicionales:
Si su hilo bucles ejecutar algo en cada iteración, se puede establecer un indicador booleano volátil tal que salga después de terminar la iteración actual (pseudocódigo porque no estoy familiarizado con Python):
while shouldExit = false // do stuff
a continuación, sólo establece el indicador de
true
cuando tú quiere que el hilo se detenga y se detendrá la próxima vez que verifique la condición.Si no puede esperar a que finalice la iteración y necesita detenerla inmediatamente, puede ir por
Thread.Abort
, pero asegúrese de que no hay forma de que pueda dejar abiertos los identificadores de archivos, sockets, bloqueos o cualquier otra cosa esto en un estado inconsistente
La primera solución es obvia, pero no es para mi caso. Tenía miedo de usar 'Thread.Abort()', porque en todas partes las personas escriben algo como "¡NUNCA UTILÍCELO!"))). Pero ahora lo uso en el programa: las manijas pueden permanecer abiertas. – aplavin
Es verdad que la mayoría de las veces es malo, pero específicamente porque la gente tiende a usar hilos para E/S u otras cosas como esta que se dejarán en un estado inconsistente si se elimina el hilo. Si no está usando el hilo para algo como esto, entonces es perfectamente seguro. – Tudor
Y se garantizaba, ese hilo con código como este 'try {// hacer el trabajo - sin try/atrapa aquí } captura (ThreadAbortException) {// ingrese salida }' se detendrá después de llamar ' Abort() 'en él? – aplavin
¿Cuál es una forma segura de detener un hilo conductor?
Ponga el hilo en su propio proceso. Cuando quiere que se detenga, mata el proceso.
Esa es la única manera segura de matar a un hilo. Anular un hilo puede desestabilizar gravemente un proceso y perder datos de usuario. No hay forma de evitar el escenario de "perder datos de usuario" si realmente necesita poder eliminar un hilo que podría estar haciendo algo. La única forma de evitar la desestabilización del proceso que exige el aborto es hacer que sean procesos diferentes por completo.
En mi caso, no hay forma de que el código de la secuencia desestabilice todo el proceso. Pero para el conocimiento común: al crear diferentes procesos, ¿quiere decir tener dos proyectos compilados en diferentes ensamblajes y uno de ellos ejecutar otro? ¿O que? – aplavin
@chersanya: Pareces muy seguro de ti mismo. Estás ejecutando un script; ¿Cómo sabes que el autor del guión no ha puesto código allí que desestabilizará el proceso o perderá los datos del usuario cuando se interrumpa? –
@chersanya diferentes procesos no necesariamente necesitan ejecutar ensamblados diferentes. Por ejemplo, 'myprogram.exe' podría iniciar un nuevo proceso ejecutando' myprogram.exe'. – phoog
- 1. ¿Cómo cierro un hilo de forma segura?
- 2. ¿Es seguro usar un indicador booleano para detener la ejecución de un hilo en C#
- 3. Detener un hilo en Java?
- 4. Detener un hilo
- 5. ¿Cuál es la mejor manera de finalizar de forma segura una aplicación java con clientes RabbitMQ en ejecución?
- 6. Detener un hilo atascado en una llamada de bloqueo
- 7. ¿Cuál es la mejor/más segura forma de reinstalar Homebrew?
- 8. sqlalchemy: detener una consulta de larga ejecución
- 9. Detener e iniciar IIS programáticamente. Forma rápida y segura
- 10. En C++ 11, ¿cuál es el punto de un hilo que "no representa un hilo de ejecución"?
- 11. ¿Es esta una forma perfecta de detener handlerthread?
- 12. ¿Cuál es una forma segura de conocer el referidor/referente en una solicitud HTTP?
- 13. iOS: ¿Cuál es una forma segura de crear un directorio temporal?
- 14. ¿Cuál es una forma relativamente segura de utilizar una cookie de inicio de sesión?
- 15. ¿Es esta una forma segura de hash de una contraseña?
- 16. Es !! una forma segura de convertir a bool en C++?
- 17. ¿Cuál es la forma más segura de configurar un área de administración en PHP?
- 18. ¿Cuál es la forma correcta/más segura de evitar la entrada en un foro?
- 19. ¿Cuál es la forma más segura de ejecutar un ejecutable en Linux?
- 20. Detener el hilo en python3
- 21. Si la terminación de un hilo colgado es una buena idea, ¿cómo lo hago de forma segura?
- 22. ¿Cuál es una forma limpia de detener a mongod en Mac OS X?
- 23. ¿Cuál es la mejor manera de detener la ejecución de un proceso de Unicorn Server?
- 24. Interrumpir/matar a un hilo en ejecución
- 25. ¿Cuál es la mejor manera de publicar de forma segura una compilación de publicación de sitio?
- 26. IntelliJ - detener un hilo durante la depuración
- 27. pasar de forma segura los datos de sólo lectura a un nuevo hilo
- 28. ¿Cuál es la mejor manera de hacer que un hilo indique otro hilo en .NET?
- 29. Auto Suspendiendo un hilo en Delphi cuando no es necesario y reanudando de manera segura
- 30. ¿Cuál es la forma más segura de conectarse a Active Directory desde una DMZ?
Sí, sacudir la alfombra de debajo de un hilo es malo. Pero si eso es lo que quieres hacer, entonces 'Thread.Abort()' es el camino a seguir. La mejor solución es modificar el diseño de su aplicación. –
¿Su cadena de bucles o solo se ejecuta para la ejecución de un solo script y luego muere? –
Se repite, pero cada iteración contiene la ejecución de scripts, que puede ser bastante larga. – aplavin