Goroutines in Prolog
Concurrencia de Tareas Ligeras (Goroutines) en Python
Una gorutina es un hilo liviano de ejecución. Supongamos que tenemos una función llamada f(s)
. Aquí se muestra cómo llamarla de la manera usual, ejecutándola de forma síncrona.
import threading
import time
def f(from_str):
for i in range(3):
print(f"{from_str} : {i}")
# Llamada directa a la función
f("direct")
# Para invocar esta función en un nuevo hilo, usa threading.Thread.
# Este nuevo hilo se ejecutará simultáneamente con el hilo que lo llama.
thread = threading.Thread(target=f, args=("threaded",))
thread.start()
# También puedes iniciar un hilo para una llamada a una función anónima.
thread = threading.Thread(target=lambda: print("going"))
thread.start()
# Esperamos a que los hilos terminen.
time.sleep(1)
print("done")
Cuando ejecutamos este programa, vemos primero la salida de la llamada bloqueante, y luego la salida de los dos hilos. La salida de los hilos puede intercalarse, porque están siendo ejecutados simultáneamente por el runtime de Python.
$ python thread_example.py
direct : 0
direct : 1
direct : 2
threaded : 0
going
threaded : 1
threaded : 2
done
En el próximo ejemplo, veremos un complemento a los hilos en programas concurrentes: colas y comunicaciones entre hilos.
Nota
: En Python, se usan hilos del módulothreading
para obtener funcionalidad similar a las gorutinas. Además,time.sleep
se usa para esperar a que los hilos terminen, pero en una aplicación más robusta deberíamos considerar el uso dequeue.Queue
oconcurrent.futures.ThreadPoolExecutor
para manejar tareas concurrentes.