IIC2233 / syllabus-2021-1

Repositorio oficial del curso IIC2233 Programación Avanzada 🚀✨
https://iic2233.github.io
38 stars 50 forks source link

Duda parte C del ejerc prop 1.4 s-05 (Minando en la DCCueva) #234

Closed JuanpaBC closed 3 years ago

JuanpaBC commented 3 years ago

Prerrequisitos

(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")

Duda

Hola, espero que te encuentres bien.

La solución que hasta el momento tengo para este ejercicio es hacer que las instancias de la subclase de threads "Minero" sean deamon threads, de manera que el codigo principal espera 5 segundos luego de ejecutar a los threads mineros, y dado que estos son deamon, al acabarse el código principal se termina el programa. El problema que tengo con esta solución es que siento que en el fondo no estoy de verdad haciendo que los mineros solo trabajen el tiempo necesario (5 segundos) como el enunciado te pide, y se evidencia en uno de los outputs que arroja mi actual solución: image como se aprecia, transcurridos los 5 segundos de espera del codigo principal, uno de los mineros alcanza a printear el resultado de su recolección de criptomonedas antes de que el thread principal acabara de ejecutarse.

por si es de ayuda, dejo el codigo de mi solución actual que generó este output:

EDIT (@aaossa): Código eliminado por ser una solución

Ya vi el resto de las guías, pero no recuerdo haber encontrado una forma de detener la ejecución de un threat en determinado momento o después de determinada cantidad de tiempo. Si me lo perdí favor indicarme donde encontrarlo, y si no, agradecería cualquier orientación en el asunto.

Desde ya gracias.

aaossa commented 3 years ago

Hola @JuanpaBC , primero que todo, eliminé tu código porque estás publicando una solución a un ejercicio propuesto. Si bien esto no está prohibido, le quita un poco "la gracia" a intentar hacer el ejercicio por su propia cuenta a tus compañeres y prefiero eliminarlo. Y por favor evita subir tu solución a la primera, no siempre es necesario ver el código para responder las issues. Ahora responderé tu pregunta.

Lo que comentas es perfectamente posible por como está escrito el código del ejercicio. Hay un sleep y luego vienen las últimas líneas (print) que deberían tomar muy poco tiempo. Es posible que justo mientras se ejecutan esas últimas líneas se imprima el resultado de la operación de un thread, pero esto no debería ocurrir consistentemente y debería ser muy poco probable. Si es algo que te ocurre siempre, habría que dar una mirada para ver que ocurre, pero si solo ocurre a veces no hay problema. ¡Éxito con tu estudio!

JuanpaBC commented 3 years ago

vale gracias, cuidaré no volver a hacer lo de subir código. Me queda claro de tu respuesta que no hay problema con el output que muestro (pues me pasa solo a veces). Aun así, hay una forma de establecer un tiempo de vida para los threads (una determinada cantidad de tiempo que quiero que el thread este vivo)?

aaossa commented 3 years ago

Mmm es una buena pregunta. Lo que se me ocurre es hacer join con un timeout desde el thread principal y luego detenerlos de alguna manera. Eso lo podrías hacer con un evento para marcarle a los threads cuando deben dejar de procesar (aunque si uno está procesando algo avanzará hasta volver a chequear el estado de la flag). Creo que es la mejor solución que se me ocurre 🤔

PS: Mientras buscaba al respecto, encontré que justo esa solución es la recomendada en la documentación:

(Original) If you want your threads to stop gracefully, make them non-daemonic and use a suitable signalling mechanism such as an Event. (Traducido) Si quieres que tus threads se detengan correctamente, hazlos no-daemon y usa un mecanismo de señalización adecuado, como un Event.

Parece que la forma más segura es usar el timeout en join y cuando pase ese timeout hacer set del evento. En este punto también es útil revisar si el thread sigue vivo (is_alive). El evento debe ser revisado dentro de cada thread y cuando el evento esté activado, dejar de procesar.

JuanpaBC commented 3 years ago

ya bkn muchas gracias!