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ódulo threading 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 de queue.Queue o concurrent.futures.ThreadPoolExecutor para manejar tareas concurrentes.