Какой же болезненный отстрел
from time import sleep
import random
import threading
from Queue import Queue
class ThreadPool(object):
def __init__(self, workers_count):
self.queue = Queue()
self.threads = []
self.shutdown = False
self.finalized = False
for _ in range(0, workers_count):
thread = threading.Thread(target=lambda: self.DoWork())
thread.daemon = True
thread.start()
self.threads.append(thread)
def Submit(self, task):
if not self.finalized:
self.queue.put(task)
def DoWork(self):
while not self.shutdown:
task = self.queue.get()
try:
task()
except Exception as e:
print e
self.queue.task_done()
def FinalizeAndWaitCompletion(self):
self.finalized = True
self.queue.join()
def DoWork(n):
print "Doing work "+str(n)+" on "+str(threading.current_thread().ident)
sleep(random.randrange(100, 10000)/1000.0)
print "Done work "+str(n)+" on "+str(threading.current_thread().ident)
def main():
tp = ThreadPool(10)
for i in range(0, 30):
tp.Submit(lambda: DoWork(i))
tp.FinalizeAndWaitCompletion()
if __name__ == '__main__':
main()
Можете атомарности и локи не тыкать, с этим все норм, не нужно.
Ладно, добавлю вывод, а то тут не все запускать будут
Doing work 3 on 140046287099648
Doing work 3 on 140046295492352
Doing work 6 on 140046278706944
Doing work 6 on 140046057334528
Doing work 6 on 140046065727232
Doing work 7 on 140046048941824
Doing work 8 on 140046040549120
Doing work 9 on 140046032156416
Doing work 10 on 140046023763712
Doing work 11 on 140046015371008
Done work 8 on 140046040549120
Doing work 14 on 140046040549120
Done work 11 on 140046015371008
Doing work 14 on 140046015371008
Done work 14 on 140046040549120
Doing work 14 on 140046040549120
Done work 6 on 140046278706944
Doing work 14 on 140046278706944
Done work 3 on 140046287099648
Doing work 14 on 140046287099648
Done work 6 on 140046057334528
Done work 7 on 140046048941824
Done work 6 on 140046065727232
Done work 10 on 140046023763712
Done work 14 on 140046287099648
Done work 14 on 140046040549120
Done work 3 on 140046295492352
Done work 9 on 140046032156416
Done work 14 on 140046015371008
Done work 14 on 140046278706944