Un stream es una lista cuyo último elemento aún no está definido, es una lista sin fin. Esto permite que la lista se expanda posteriormente a ser definida, ya sea manualmente o a través de una función recursiva.
local A B C in
A = 1|2|3|B
B = 4|5|6|C
C = 7|8|9|nil
endProductor Consumidor
Esto puede ser utilizado para comunicar hilos. Un hilo expande progresivamente una lista, mientras que otro hilo tome los valores a medida que se van generando.
local Produce Consume L in
Produce = proc {$ N Limit L}
{Time.delay 500}
if N < Limit then
local T in
L = N|T
{Produce N+1 Limit T}
end
end
end
Consume = proc {$ L}
case L of H|T then
if H mod 2 == 0 then
{Browse H}
end
{Consume T}
end
end
thread {Produce 0 10 L} end
thread {Consume L} end
endDemand Driven Concurreny
En el problema anterior, puede surgir el problema de que el consumidor no tome recurso a la misma velocidad que se produce.
Para solucionar esto, podemos hacer que el consumidor le indique al productor cuando producir. El consumidor crea un nuevo elemento vacío, y el productor le da un valor.
Bounded Buffer
El productor produce elementos, pero con un límite. No debe esperar a que el productor necesite un elemento, pero tampoco puede producir indefinidamente.
Múltiples Productores
Si queremos tener múltiples productores, entonces puede haber problemas de concurrencia. Para resolverlo, necesitaremos canales.