/
ThreadPool.py
69 lines (52 loc) · 1.45 KB
/
ThreadPool.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
"""
ThreadPool.py -- Implement a simple thread pool.
by elchupa
"""
import threading
from Queue import Queue
import logging
class Worker( threading.Thread ):
def __init__( self, event, jobs ):
threading.Thread.__init__( self )
self.jobs = jobs
self.daemon = True
self.event = event
self.start()
self.logger = logging.getLogger( "ThreadPool.Worker" )
def run( self ):
while not self.event.is_set():
func, args, kargs = self.jobs.get()
self.logger.info( "Got Work" )
try:
func( *args, **kargs )
except Exception, e:
self.logger.info( str( e ) )
self.jobs.task_done()
class ThreadPool:
def __init__( self, numThreads = 10 ):
self.jobs = Queue( numThreads )
self.event = threading.Event()
for _ in range( numThreads ):
Worker( self.event, self.jobs )
self.logger = logging.getLogger( "PoolManager.ThreadPool" )
def addJob( self, func, *args, **kargs ):
self.jobs.put( ( func, args, kargs ) )
self.logger.info( "Added a new job" )
self.logger.info( "Threads left in pool: " + str( self.jobs.qsize() ) )
self.logger.info( "If the Queue full? : " + str( self.jobs.full() ) )
def waitAll( self ):
self.jobs.join()
def killAll( self ):
self.event.set();
if __name__ == "__main__":
from time import sleep
def test( t ):
print "yay: " + str( t )
sleep( 1 )
def kill( event ):
sleep( 5 )
event.set()
pool = ThreadPool( 10000 )
for i in range( 100000 ):
pool.addJob( test, i )
pool.waitAll()