whileのループでqueueから待ち受けるという処理を3つのスレッドで同時に実行している。うむ、中々複雑になってきた。
import time from queue import Queue from threading import Thread Washload = str class Washer(Thread): def __init__(self, in_queue: Queue[Washload], out_queue: Queue[Washload]): super().__init__() self.in_queue = in_queue self.out_queue = out_queue def run(self) -> None: while True: washload = self.in_queue.get() print(f"Washer: washing{washload}...") time.sleep(4) self.out_queue.put(f'{washload}') self.in_queue.task_done() class Dryer(Thread): def __init__(self, in_queue: Queue[Washload], out_queue: Queue[Washload]): super().__init__() self.in_queue = in_queue self.out_queue = out_queue def run(self) -> None: while True: washload = self.in_queue.get() print(f"Dryer: dying {washload} ...") time.sleep(2) self.out_queue.put(f'{washload}') self.in_queue.task_done() class Folder(Thread): def __init__(self, in_queue: Queue[Washload]): super().__init__() self.in_queue = in_queue def run(self) -> None: while True: washload = self.in_queue.get() print(f"Folder: folding {washload}...") time.sleep(1) print(f"Folder: {washload} done!") self.in_queue.task_done() class Pipeline: def assemble_laundry_for_washing(self) -> Queue[Washload]: washload_count = 4 washloads_in: Queue[Washload] = Queue(washload_count) for washload_num in range(washload_count): washloads_in.put(f'Washload #{washload_num}') return washloads_in def run_concurrently(self) -> None: to_be_washed = self.assemble_laundry_for_washing() to_be_dried: Queue[Washload] = Queue() to_be_folded: Queue[Washload] = Queue() Washer(to_be_washed, to_be_dried).start() Dryer(to_be_dried, to_be_folded).start() Folder(to_be_folded).start() to_be_washed.join() to_be_dried.join() to_be_folded.join() print("All done!") if __name__ == "__main__": pipeline = Pipeline() pipeline.run_concurrently()
$ python3 pipeline.py
Washer: washingWashload #0…
Washer: washingWashload #1…
Dryer: dying Washload #0 …
Folder: folding Washload #0…
Folder: Washload #0 done!
Washer: washingWashload #2…
Dryer: dying Washload #1 …
Folder: folding Washload #1…
Folder: Washload #1 done!
Washer: washingWashload #3…
Dryer: dying Washload #2 …
Folder: folding Washload #2…
Folder: Washload #2 done!
Dryer: dying Washload #3 …
Folder: folding Washload #3…
Folder: Washload #3 done!
All done!