diff --git a/leansim/main.py b/leansim/main.py index 55d0af3..e895107 100644 --- a/leansim/main.py +++ b/leansim/main.py @@ -3,16 +3,18 @@ def main(): parser = argparse.ArgumentParser() - parser.add_argument('--workers', '-w', default=4, help='Number of workers in value stream.') - parser.add_argument('--work', default=20, help='Number of products to make.') - parser.add_argument('--duration', default=2, help='Number of time steps each process takes.') - parser.add_argument('--batch', default=20, help='Batch size for each worker.') - parser.add_argument('--sleep', default=0.2, help='Time to sleep between steps.') - # parser.add_argument('--bottleneck', default=False) + parser.add_argument('--workers', '-w', default=4, type=int, help='Number of workers in value stream.') + parser.add_argument('--work', default=100, type=int, help='Number of products to make.') + parser.add_argument('--duration', default=2, type=int, help='Number of time steps each process takes.') + parser.add_argument('--batch', default=20, type=int, help='Batch size for each worker.') + parser.add_argument('--sleep', default=0.05, type=float, help='Time to sleep between steps.') + parser.add_argument('--bottleneck', default=0, type=int, help='Position of bottleneck. If 0, no bottleneck exists.') + parser.add_argument('--max_todo', default=None, type=int, help='Maximum worker todo list size. Used for demonstrating pull/kanban system') + args = parser.parse_args() Workflow.run_chained_process(workers=args.workers, work=args.work, task_duration=args.duration, batch_size=args.batch, - verbose=True, sleep_time=args.sleep) + verbose=True, sleep_time=args.sleep, max_todo=args.max_todo, bottleneck_worker=args.bottleneck) diff --git a/leansim/workflow.py b/leansim/workflow.py index 2fffb6d..600e0b4 100644 --- a/leansim/workflow.py +++ b/leansim/workflow.py @@ -53,17 +53,19 @@ def __repr__(self): rep += '-----------------------------------------------------------\n' - for attr in ['total_work', 'wip', 'work_done']: + for attr in ['total_work', 'wip']: rep += '{}: {} '.format(attr, getattr(self, attr)) return rep @classmethod - def run_chained_process(cls, work=20, workers=4, verbose=False, sleep_time=0.2, **worker_kwargs): + def run_chained_process(cls, work=20, workers=4, verbose=False, sleep_time=0.2, bottleneck_worker=None, **worker_kwargs): queue = [Worker(**worker_kwargs) for _ in range(workers)] for w1, w2 in zip(queue[:-1], queue[1:]): w1.target = w2 workflow = cls(workers=queue) + if bottleneck_worker: + workflow.workers[bottleneck_worker - 1].task_duration = workflow.workers[0].task_duration * 4 steps = workflow.process(work=work, verbose=verbose, sleep_time=sleep_time) return steps \ No newline at end of file