Fundamentos de Programación y Python

1

¿Por qué aprender Python?

2

Introducción a Python

3

Conceptos Básicos de Programación

4

Práctica: Te doy la bienvenida a los ejercicios interactivos

5

Manipulación de Cadenas de Texto en Python

6

Enteros, Flotantes y Booleanos

7

Todo lo que Debes Saber sobre print en Python

8

Operaciones Matemáticas en Python

9

Operaciones de Entrada/Salida en Consola

Colección y Procesamiento de Datos en Python

10

Listas

11

Método slice

12

Listas de más dimensiones y Tuplas

13

Aplicación de Matrices

14

Diccionarios

15

Comprehension Lists en Python (CLASE NUEVA)

Control de Flujo en Python

16

Estructuras condicionales

17

Bucles y Control de Iteraciones

18

Generadores e Iteradores

Funciones y Manejo de Excepciones en Python

19

Uso de Funciones en Python

20

Funciones Lambda y Programación Funcional en Python

21

¿Cómo realizar una función recursiva en Python?

22

Manejo de Excepciones y Uso de Pass (CLASE NUEVA)

Programación Orientada a Objetos en Python

23

Fundamentos de Programación Orientada a Objetos en Python

24

Ejercicio Biblioteca con POO

25

Herencia en POO con Python

26

Objetos heredados

27

Los 4 pilares de la programacion orientada a objetos

28

Uso de super() en Python (CLASE NUEVA)

29

Superando los Fundamentos de Programación Orientada a Objetos en Python

Lectura y escritura de archivos

30

Manejo de Archivos .TXT (CLASE NUEVA)

31

Manejo de Archivos CSV (CLASE NUEVA)

32

Manejo de Archivos JSON (CLASE NUEVA)

Biblioteca estándar de Python

33

Biblioteca estándar en Python (CLASE NUEVA)

34

Librería Os, Math y Random (CLASE NUEVA)

35

Librería Statistics y Análisis Estadístico (CLASE NUEVA)

36

Proyecto final: Guerra naval

Conceptos avanzados de Python

37

Recapitulación de lo aprendido hasta ahora

38

Escribir código Pythonico y profesional

39

Comentarios y Docstrings en Python

40

Scope y closures: variables locales y globales

41

Anotaciones de tipo

42

Validación de tipos en métodos

43

Librería Collections y Enumeraciones

Decoradores

44

Decoradores en Python

45

Decoradores anidados y con parámetros

46

Uso de Decoradores en clases y métodos

Métodos y estructura de clases en Python

47

Métodos mágicos

48

Sobrecarga de operadores

49

Implementación de `if __name__ == "__main__":`

50

Metaprogramación en Python

51

Uso de *args y **kwargs

52

Métodos privados y protegidos

53

Gestión avanzada de propiedades

54

Métodos estáticos y de clase avanzados

Programación concurrente y asíncrona

55

Introducción a la concurrencia y paralelismo

56

Threading y multiprocessing en Python

57

Asincronismo con asyncio

58

Asincronismo y concurrencia

Creación de módulos y paquetes

59

Creación de módulos en Python

60

Gestión de paquetes

61

Publicación de paquetes en PyPI

Proyecto final

62

Implementación de un sistema completo

63

Implementación de un Sistema Completo

No tienes acceso a esta clase

¡Continúa aprendiendo! Únete y comienza a potenciar tu carrera

Curso de Python

Curso de Python

Carli Code

Carli Code

Introducción a la concurrencia y paralelismo

55/63
Recursos

Aportes 3

Preguntas 1

Ordenar por:

¿Quieres ver más aportes, preguntas y respuestas de la comunidad?

La concurrencia y el paralelismo son conceptos clave en la programación de alto rendimiento y el diseño de aplicaciones modernas, especialmente en entornos donde se necesita manejar múltiples tareas al mismo tiempo para optimizar el uso de recursos. Aunque ambos términos están relacionados, representan enfoques diferentes para ejecutar varias tareas simultáneamente. Vamos a desglosar los conceptos básicos y las diferencias. \### Concurrencia La \*\*concurrencia\*\* se refiere a la capacidad de un sistema para gestionar múltiples tareas al mismo tiempo, sin necesariamente ejecutarlas simultáneamente. En un entorno concurrente, las tareas pueden progresar en paralelo, aunque no estén ejecutándose al mismo tiempo, ya que el sistema cambia rápidamente entre tareas. \#### Ejemplo de concurrencia Imagina que estás en una cocina preparando varias recetas: cortas los ingredientes de una receta, luego los de otra, y vas alternando. No completas una receta antes de comenzar con otra, sino que cambias entre ellas para hacer progresos en todas. \- \*\*Multithreading\*\*: Un enfoque común de concurrencia en el que múltiples "hilos" de ejecución se utilizan para dividir las tareas. En Python, se pueden utilizar con la biblioteca `threading` para tareas I/O intensivas (como la lectura y escritura en archivos o las solicitudes de red), debido a las limitaciones del Global Interpreter Lock (GIL). ```python import threading def tarea(nombre): print(f"Iniciando tarea: {nombre}") hilo1 = threading.Thread(target=tarea, args=("Tarea 1",)) hilo2 = threading.Thread(target=tarea, args=("Tarea 2",)) hilo1.start() hilo2.start() hilo1.join() hilo2.join() ``` \### Paralelismo El \*\*paralelismo\*\* es la capacidad de ejecutar múltiples tareas al mismo tiempo, aprovechando varios núcleos de CPU. En un entorno verdaderamente paralelo, varias tareas se ejecutan simultáneamente en diferentes núcleos, lo que es ideal para tareas que requieren un uso intensivo de CPU. \#### Ejemplo de paralelismo Siguiendo el ejemplo de la cocina, en un entorno paralelo, tienes varios chefs en la cocina, y cada uno trabaja en una receta diferente simultáneamente. \- \*\*Multiprocessing\*\*: En Python, la biblioteca `multiprocessing` permite crear varios procesos independientes que pueden ejecutarse en paralelo, sin las limitaciones del GIL. Esto es útil para tareas que necesitan cálculos intensivos, como el procesamiento de grandes volúmenes de datos. ```python from multiprocessing import Process def tarea(nombre): print(f"Iniciando tarea: {nombre}") proceso1 = Process(target=tarea, args=("Tarea 1",)) proceso2 = Process(target=tarea, args=("Tarea 2",)) proceso1.start() proceso2.start() proceso1.join() proceso2.join() ``` \### Diferencias clave entre concurrencia y paralelismo | Característica | Concurrencia | Paralelismo | |------------------|-------------------------------------------------------------------|-------------------------------------------------------| | \*\*Definición\*\* | Habilidad de manejar múltiples tareas al mismo tiempo. | Ejecución simultánea de tareas en diferentes núcleos. | | \*\*Ejemplo\*\* | `threading` (conmutación rápida entre tareas). | `multiprocessing` (tareas ejecutadas en paralelo). | | \*\*Aplicaciones\*\* | Ideal para tareas I/O intensivas. | Ideal para tareas CPU intensivas. | \### Concurrencia y paralelismo en Python: retos y limitaciones Python maneja la concurrencia con hilos (`threading`) y el paralelismo con procesos (`multiprocessing`). Sin embargo, el \*\*GIL\*\* limita la ejecución de hilos en Python, lo que hace que el uso de `multiprocessing` sea preferible para tareas intensivas en CPU, mientras que `threading` es útil para tareas de I/O. \### Alternativas: `asyncio` para concurrencia asíncrona Para manejar concurrencia de manera más eficiente, Python también ofrece `asyncio`, que permite trabajar con tareas asíncronas sin crear múltiples hilos o procesos. Es especialmente útil en aplicaciones de red y permite manejar tareas I/O en paralelo de manera eficiente. ```python import asyncio async def tarea(nombre): print(f"Iniciando tarea: {nombre}") await asyncio.sleep(1) print(f"Terminando tarea: {nombre}") async def main(): await asyncio.gather(tarea("Tarea 1"), tarea("Tarea 2")) asyncio.run(main()) ``` \### Resumen \- \*\*Concurrencia\*\*: Capacidad de manejar múltiples tareas a la vez, alternando entre ellas. Ideal para tareas de I/O intensivas. \- \*\*Paralelismo\*\*: Ejecución simultánea de tareas en múltiples núcleos. Ideal para tareas CPU intensivas. \- \*\*`asyncio`\*\*: Permite manejar tareas asíncronas y concurrentes de manera eficiente sin usar múltiples hilos o procesos. Cada enfoque tiene sus fortalezas y limitaciones, y la elección depende de la naturaleza de las tareas.
La verdad es que se me hace muy cuesta arriba comprender las clases porque siempre se usan las mismas palabras para nombrar variables, métodos, clases, etc. Aunque tengan una letra mayúscula o una "s" de diferencia el código resulta siendo una repetición constante de la misma palabra (en este caso por ejemplo "thread") y se me hace totalmente incomprensible. Me da pena porque empecé con mucha ilusión el curso pero a estas alturas se me está haciendo muy frustrante y siento que no estoy asimilando bien las lecciones. Cada vez que veo un video tengo que buscar la misma lección en youtube o preguntar a chatGPT para que me lo explique porque siento que no me he enterado de casi nada...
Un método estático pertenece a la clase, no a una instancia, y no puede acceder a atributos o métodos de instancia. Se define utilizando el decorador `@staticmethod`. En cambio, un método de clase recibe la clase como primer argumento (normalmente `cls`) y puede acceder a atributos y métodos de la clase. Se define con el decorador `@classmethod`. Ambos son utilizados para diferentes propósitos, siendo los de clase útiles para manipular la clase en sí y los estáticos para funciones que no requieren acceso a la clase o instancia.