3
3
4
4
5
5
class Worker (object ):
6
- def __init__ (self , pool ):
7
- self .pool = pool
6
+ def __init__ (self , queue , timeout , output ):
7
+ self .queue = queue
8
+ self .timeout = timeout
9
+ self .output = output
8
10
9
- def __call__ (self , task , output , timeout ):
10
- self .run_task (task )
11
- self .pool .workers .append (self )
11
+ def __call__ (self ):
12
+ while True :
13
+ try :
14
+ # get task from queue
15
+ task = self .queue .pop (0 )
16
+ # run task
17
+ self .run_task (task )
18
+ except IndexError :
19
+ break
12
20
13
21
@staticmethod
14
22
def run_task (task ):
@@ -17,28 +25,47 @@ def run_task(task):
17
25
18
26
class Pool (object ):
19
27
def __init__ (self , max_workers , queue , timeout , output ):
28
+
29
+ # check if there are enough workers
30
+ if max_workers <= 0 :
31
+ raise ValueError ("Workers must be >= 1" )
32
+
33
+ # check if the queue is empty
34
+ if not queue :
35
+ raise ValueError ("The queue is empty" )
36
+
20
37
self .queue = queue
21
- self .workers = [Worker (self ) for w in range (max_workers )]
22
38
self .timeout = timeout
23
39
self .output = output
40
+ self .max_workers = max_workers
24
41
25
42
def run (self ):
26
- while True :
27
43
28
- # make sure resources are available
29
- if not self .workers :
30
- continue
44
+ workers = [Worker (self .queue , self .timeout , self .output ) for w in range (self .max_workers )]
45
+ threads = []
31
46
32
- # check if the queue is empty
33
- if not self .queue :
34
- break
35
47
36
- # get a worker
37
- worker = self .workers .pop (0 )
48
+ # run
49
+ for worker in workers :
50
+ thread = threading .Thread (target = worker )
51
+ thread .start ()
52
+ threads .append (thread )
38
53
39
- # get task from queue
40
- task = self .queue .pop (0 )
54
+ # wait until all workers have completed their tasks
55
+ for thread in threads :
56
+ thread .join ()
41
57
42
- # run
43
- thread = threading .Thread (target = worker , args = (task , self .output , self .timeout ))
44
- thread .start ()
58
+ if __name__ == "__main__" :
59
+ tasks = ["sleep 1" ,
60
+ "sleep 2" ,
61
+ "sleep 3" ,
62
+ "sleep 4" ,
63
+ "sleep 5" ,
64
+ "sleep 6" ,
65
+ "sleep 7" ,
66
+ "sleep 8" ,
67
+ "sleep 9" ,
68
+ "sleep 1" ,
69
+ "echo 'Char!'" ]
70
+ p = Pool (4 , tasks , 0 , 0 )
71
+ p .run ()
0 commit comments