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
doneEn 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ódulothreadingpara obtener funcionalidad similar a las gorutinas. Además,time.sleepse usa para esperar a que los hilos terminen, pero en una aplicación más robusta deberíamos considerar el uso dequeue.Queueoconcurrent.futures.ThreadPoolExecutorpara manejar tareas concurrentes.