multithreading - stop - programa de hilos en python
Cómo detener largos hilos de ejecución con gracia? (4)
La forma preferida es modificar el código para que no se bloquee sin verificar la cancelación.
Como no puedes modificar el código, no puedes hacer eso; usted debe vivir con la operación de fondo (pero puede desasociarla de cualquier UI, de modo que se ignorará su finalización); o alternativamente, puedes intentar terminarlo (TerminateThread API terminará groseramente cualquier hilo dado su manejo). La terminación no es limpia, sin embargo, como dice Rob, cualquier bloqueo mantenido por el hilo será abandonado, y cualquier estado de hilo cruzado protegido por dichos bloqueos puede estar en un estado dañado.
¿Puedes considerar llamar a la función en un ejecutable por separado? ¿Quizás usar RPC (pipes, TCP, en lugar de memoria compartida debido al mismo problema de bloqueo), para que pueda finalizar un proceso en lugar de terminar un hilo? El aislamiento del proceso le dará mucha más protección. Siempre y cuando no dependa de elementos nombrados de proceso cruzado como mutexes, debería ser mucho más seguro que matar un hilo.
Tengo un problema con Threading con Delphi. Supongo que esto también es común en otros idiomas. Tengo un proceso largo que hago en un hilo, que llena una lista en la ventana principal. Pero si algunos parámetros cambian mientras tanto, entonces debería detener el hilo de ejecución actual y comenzar desde el principio. Delphi sugiere terminar un hilo configurando Terminated: = true y verificando el valor de esta variable en el hilo. Sin embargo, mi problema es este, la parte de ejecución larga está enterrada en una llamada a la biblioteca y en esta convocatoria no puedo verificar la variable Terminated. Por lo tanto, tuve que esperar a que terminara esta llamada a la biblioteca, lo que afecta a todo el programa.
¿Cuál es la forma preferida de hacer en este caso? ¿Puedo matar el hilo inmediatamente?
Los hilos deben cooperar para lograr un cierre elegante. No estoy seguro de si Delphi ofrece un mecanismo para abortar otro hilo, pero tales mecanismos están disponibles en .NET y Java, pero deben considerarse como una opción de último recurso, y el estado de la aplicación es indeterminado después de que se hayan utilizado.
Si puede matar un hilo en un punto arbitrario, puede matarlo mientras mantiene un bloqueo en el asignador de memoria (por ejemplo). Esto dejará su programa abierto para colgar cuando su siguiente hilo principal necesite acceder a ese bloqueo.
Si no puede modificar el código para verificar la terminación, simplemente establezca su prioridad muy baja e ignórela cuando vuelva.
Escribí esto en respuesta a una pregunta similar :
Utilizo una técnica basada en excepciones que me ha funcionado bastante bien en varias aplicaciones Win32.
Para finalizar un hilo, uso QueueUserAPC para poner en cola una llamada a una función que arroja una excepción. Sin embargo, la excepción que se lanza no se deriva del tipo "Excepción", por lo que solo será captada por el procedimiento de reinicio de mi hilo.
Lo he usado con las aplicaciones de C ++ Builder con mucho éxito. No estoy al tanto de todas las sutilezas del manejo de excepciones de Delphi vs C ++, pero espero que pueda modificarse fácilmente para que funcione.