Control structures in programming languages: from goto to algebraic effects

Xavier Leroy

Coroutines in Python (chapter 4)

# Section 4.3: Coroutines and cooperative threads

import queue

n = 0

def build():
    global n
    r = n
    print("build", r)
    n += 1
    return r

def use(n):
    print("use", n)

q = queue.Queue(10)
consume = None
produce = None

def produce_gen():
    n = 0
    while True:
        while not q.full(): item = build(); q.put(item)
        yield consume
        
def consume_gen():
    while True:
        while not q.empty(): item = q.get(); use(item)
        yield produce

produce = produce_gen()
consume = consume_gen()

c = produce
for i in range(5): c = next(c)