/
ThreadPool.py
executable file
·123 lines (104 loc) · 3.32 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
#!/usr/bin/env python
#coding=utf-8
from Queue import Queue,Empty
from threading import Thread
import traceback
import sys
DEBUG = True
def my_print(*args):
if DEBUG:
print args
class Worker(Thread):
"""工作线程类,完成任务执行和结果获取"""
def __init__(self, work_queue, result_queue, timeout):
my_print('init')
Thread.__init__(self);
self.setDaemon(True)
self.state = None
self.work_que= work_queue
self.result_queue = result_queue
self.timeout = timeout
self.start()
def run(self):
while(True):
my_print('while', self.getName())
if self.state == 'stop':
break
try:
my_print('get')
task = self.work_que.get(timeout=self.timeout)
my_print(task)
func, args, kwargs = task
# (func, args, kwargs) = self.work_que.get(timeout=self.timeout)#block func
print 'func,args,kwargs', func, args, kwargs
except Empty:
my_print('continue')
continue
try:
my_print('start func')
my_print(args)
my_print(kwargs)
res = func(*args, **kwargs)
print 'res',res
result = {args:res}
print 'result', result
self.result_queue.put(result)
self.work_que.task_done()
except Exception,e:
traceback.print_exc()
my_print(e)
break
def stop(self):
self.state = 'stop'
class ThreadPool():
"""创建一个线程池"""
def __init__(self, thread_num, timeout):
self.work_queue = Queue()
self.result_queue = Queue()
self.thread_pool = []
self.thread_num = thread_num
self.timeout = timeout
self.start_thread_pool()
def start_thread_pool(self):
for i in range(self.thread_num):
worker = Worker(self.work_queue, self.result_queue, self.timeout)
self.thread_pool.append(worker)
def add_task(self, func, *args, **kwargs):
if not self.work_queue.full():
self.work_queue.put(func, args, kwargs)
def get_result(self):
if not self.result_queue.empty():
return self.result_queue.get()
else:
return None
def task_done(self):
return self.work_queue.task_done()
def task_join(self):
self.work_queue.join()
def stop_thread_pool(self):
for i in range(self.thread_num):
self.thread_pool[i].stop()
del self.thread_pool[:]
def test(num1, num2):
print "after plus:",num1+num2
return num1+num2
if __name__ == "__main__":
task = (test,(1,2),{})
work_queue = Queue()
result_queue = Queue()
timeout = 0.5
worker = Worker(work_queue,result_queue, timeout)
for i in range(4):
work_queue.put(task)
print result_queue.get()
print 'queue size', work_queue.qsize()
print 'queue size', result_queue.qsize()
work_queue.join()
#result_queue.join()
worker.stop()
sys.exit()
threadpool = ThreadPool(5, 0.5)
for i in range(10):
threadpool.add_task(test,1,2)
print threadpool.get_result()
threadpool.task_join()