Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- from argparse import ArgumentParser
- import time
- from random import random
- from threading import Thread, Event
- from queue import Queue, Empty
- class MyThread(Thread):
- def __init__(self, thread_id, name, counter, message, result_queue, event):
- super().__init__()
- self.thread_id = thread_id
- self.name = name
- self.counter = counter
- self.message = message
- self.result_queue = result_queue
- self.event = event
- def run(self):
- print (f"{self.name} started")
- for i in range(self.counter):
- # each iteration simulates a big_calculation
- # looking, if self.event is set
- if self.event.is_set():
- break
- # thread ends here
- # if event is_set
- time.sleep(random() * 5)
- # simulates random time for computation
- self.result_queue.put(self.message)
- # for-loop is finite
- class Printer(Thread):
- def __init__(self, result_queue, event):
- super().__init__()
- self.result_queue = result_queue
- self.event = event
- def run(self):
- while not self.event.is_set():
- try:
- result = self.result_queue.get_nowait()
- except Empty:
- time.sleep(0.5)
- else:
- self.result_queue.task_done()
- print(result)
- def main(workers):
- result_queue = Queue()
- event = Event()
- threads = [
- MyThread(
- thread_id=n,
- name=f'Thread {n}',
- counter=15,
- message=f'Do something {n}',
- result_queue=result_queue,
- event=event,
- )
- for n in range(1, workers + 1)
- ]
- [t.start() for t in threads]
- print("Threads started, adding printer")
- printer = Printer(result_queue, event)
- printer.start()
- print("Sleeping for 10 seconds")
- time.sleep(10)
- print("Set event, which will end all threads after the next iteration of all threads")
- event.set()
- if __name__ == '__main__':
- parser = ArgumentParser(description='Example program for threads')
- parser.add_argument('threads', type=int, help='Amount of worker threads')
- args = parser.parse_args()
- main(args.threads)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement