68 lines
1.5 KiB
Python
68 lines
1.5 KiB
Python
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)
|
|
|
|
|
|
|