import threading import multiprocessing import time import sys def handler(tq, wq): while tq.empty() is not True: ticker = tq.get(0.1) wq.put(ticker-1000) time.sleep(0.01) tq.task_done() def worker(wq, i): while True: task = wq.get(2) with i.get_lock(): if task is None: break i.value += 1 time.sleep(0.001) wq.task_done() wq.task_done() ticker_queue = multiprocessing.JoinableQueue() work_queue = multiprocessing.JoinableQueue() iterations = multiprocessing.Value('i', 0) tickers = range(1000) processes = [] threads = [] def looprun(n): for i in tickers: ticker_queue.put(i) for i in range(20): t = threading.Thread(target = handler, args = (ticker_queue, work_queue)) t.deamon = True t.start() threads.append(t) for i in range(8): p = multiprocessing.Process(target = worker, args = (work_queue, iterations, )) p.deamon = True p.start() processes.append(p) ticker_queue.join() for i in range(8): work_queue.put(None) work_queue.join() print("Closing down workers") for p in processes: p.join() print("Run:",n) print("Total number of iterations:", iterations.value) return if __name__=='__main__: for n in range(100): looprun(n+1)