Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Dudas varias sobre threading #120

Open
5 tasks done
panchouc opened this issue Sep 4, 2022 · 2 comments
Open
5 tasks done

Dudas varias sobre threading #120

panchouc opened this issue Sep 4, 2022 · 2 comments
Assignees
Labels
Contenidos Dudas sobre contenidos Resuelto

Comments

@panchouc
Copy link

panchouc commented Sep 4, 2022

Prerrequisitos

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

  • Leí las reglas del foro (Instalación py 3.11.X con X>=7 Syllabus#1).
  • Busqué en las issues si ya preguntaron mi duda y no encontré nada parecido (https://github.com/IIC2233/syllabus/issues).
  • Mi duda no se trata de un tema administrativo o personal, ya que en ese caso debo contactar a mi profe, al Jefe de Bienestar o al correo del curso (iic2233@ing.puc.cl).
  • Utilizaré un título descriptivo y llenaré correctamente esta plantilla.
  • De ser necesario, colocaré código simple que permita explicar mi problema o duda.

Duda

¡Hola!
Leyendo sobre los contenidos de threading me surgieron varias dudas.

  • Tengo entendido de que entre los tantos usos de threading están los de I/O bound y long running tasks. Por lo que sé, también está el módulo de asyncio que también puede lograr cosas similares respecto al aspecto de I/O bound, pero teniendo en cuenta de que si se ocupa asyncio se tienen cosas single-threaded mientras que con threading si se utilizan varios hilos. Teniendo eso en cuenta, ¿Por qué habría que preferir asyncio por sobre threading o viceversa (específicamente para I/O bound tasks)?. Tengo entendido igual de que asyncio es bastante rápido, "simula el threading", pero sin lidiar con los potenciales problemas que podrían surgir con threading.
  • Algo que me confunde un poco es el concepto de ejecutar múltiples tareas de forma paralela, ¿Es esto realmente así con threading y asyncio?. Por lo que he leído, es que gracias al GIL (Global Interpreter Lock), en verdad Python siempre está ejecutando una única acción a la vez. Entonces, basándose en eso, como que en verdad el tema del paralelismo con el threading en si es que, ¿Se considera que hace cosas de forma paralela, dado por la rapidez con la que se realizan las tareas?.
  • También tengo una duda respecto, a si por ejemplo quiero lanzar múltiples tareas con distintos threads, en tal caso, tengo entendido de que existe concurrent.futures.ThreadPoolExecutor, ¿Me conviene más ocupar esa funcionalidad, o yo mismo empezar a crear los threads uno a uno y después iniciarlos?, o mejor dicho, ¿En que caso me conviene más hacer que cosa (si ocupar ThreadPoolExecutor o yo mismo crear múltiples threads)?.
  • También, por curiosidad solamente, me gustaría saber porque en el curso no se aborda sobre multiprocessing, porque tengo entendido que se utiliza en tareas en que la principal limitante es la CPU (creo) y no recursos externos (como esperar a un usuario), y hasta donde entiendo, es que en multiprocessing realmente se puede hablar realmente de computación paralela, ya que ahí cada proceso tiene su propio GIL, así, por lo que entiendo, cada proceso estaría ejecutando su propio set de instrucciones, cada uno independiente del otro.
    De antemano muchas gracias por la respuesta y perdón si me extendí mucho.
    PD: Mis disculpas si utilicé mal algún concepto y en caso de que sea así, háganmelo saber, no me manejo tanto en el tema ya que es nuevo para mi. Mencionar que me leí lo que aparecía aquí y en este otro link.
@Lord-Kelsier Lord-Kelsier self-assigned this Sep 5, 2022
@Lord-Kelsier
Copy link

Hola, te respondo en orden:

  • Async funciona utilizando lo que se llama cooperative scheduling, esto implica que cuando una funcion se ejecuta, esta va a seguir haciendolo hasta terminar, por lo que las funciones deben cooperar (el programador debe hacer que cooperen) para no bloquearse mutuamente. Por otro lado, Threading utiliza preemtive scheduling lo que implica que las funciones son interrumpidas por el sistema operativo para continar con otra (lo cual puede traer problemas de concurrencia [arreglado con locks]: Una forma de ejemplificar como funciona Async es la siguiente:
import time 
import select
from sys import stdin 

# codigo de https://www.youtube.com/watch?v=NZq31Sg8R9E&t=1595s&ab_channel=PyConSouthAfrica
def clock_echo():
  start = time.time()
  i = 0
  while True:
    # Clock
    if (time.time() - start) // 2 == i:
      print(time.ctime())

    # print input
    available, _, _ = select.select([stdin], [], [], 0)
    if available:
      message = input()
      print(message)

este codigo es equivalente a tener un thread que cada 2 segundos imprime la fecha y hora, y otro thread que espera al input del usuario y lo imprime, notar como en vez de simplemente esperar, lo que hace es revisar si se cumple una condicion para ejecutarse. Ambas son herramientas con sus beneficios y complicaciones, aqui algunos de los pros y contras:
image
(esta respuesta esta basada en este video)

  • En efecno no se realizan de forma paralela, lo mas cercano es el pseudo paralelismo de los threads. Aqui algo de lectura complementaria
  • Es conveniente usar ThreadPoolExecutor cuando tienes muchos threads, ya que los crea de manera eficiente. Por esta misma razon es poco probable que necesites usarlo en el curso. Referencia
  • En este curso no se tratan temas de eficiencia, por lo que nos basta que entiendan los threads y de esta forma si necesitan multiprocessing en el futuro puedan entender como funciona en base a estos conociemientos. Realmente existen muchos temas que no se abarcan en el curso, pero estos son la base sobre la cual se construye la mayoria. Igualmente te recomiendo este video y este canal en el que se abordan temas muy interesantes sobre programacion en python.

Saludos!

@Lord-Kelsier Lord-Kelsier added the Contenidos Dudas sobre contenidos label Sep 5, 2022
@panchouc
Copy link
Author

panchouc commented Sep 6, 2022

¡Buenardo!, muchas gracias jsjs, agradecido por la respuesta.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Contenidos Dudas sobre contenidos Resuelto
Projects
None yet
Development

No branches or pull requests

2 participants