You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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.
The text was updated successfully, but these errors were encountered:
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:
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:
(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.
Prerrequisitos
(Marcar colocando una X entre los corchetes los ítems que ya hiciste, así: "[X]")
Duda
¡Hola!
Leyendo sobre los contenidos de
threading
me surgieron varias dudas.threading
están los deI/O bound
y long running tasks. Por lo que sé, también está el módulo deasyncio
que también puede lograr cosas similares respecto al aspecto deI/O bound
, pero teniendo en cuenta de que si se ocupaasyncio
se tienen cosassingle-threaded
mientras que conthreading
si se utilizan varios hilos. Teniendo eso en cuenta, ¿Por qué habría que preferirasyncio
por sobrethreading
o viceversa (específicamente para I/O bound tasks)?. Tengo entendido igual de queasyncio
es bastante rápido, "simula el threading", pero sin lidiar con los potenciales problemas que podrían surgir conthreading
.threading
yasyncio
?. 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 elthreading
en si es que, ¿Se considera que hace cosas de forma paralela, dado por la rapidez con la que se realizan las tareas?.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 ocuparThreadPoolExecutor
o yo mismo crear múltiples threads)?.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 propioGIL
, 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.
The text was updated successfully, but these errors were encountered: