# # Discrete event simulation - Resources # from cofunctions import * from simulation import enqueue, wakeup class Resource: def __init__(self, capacity): self.available = capacity self.queue = [] @cofunction def acquire(self, cocall, amount): enqueue(self.queue) if len(self.queue) > 1: yield while amount > self.available: yield self.queue.pop(0) self.available -= amount def release(self, amount): self.available += amount if self.queue: wakeup(self.queue[0])