代码语言:javascript复制
import Queue
import threading
class ThreadPool(object):
def init(self, maxsize=4, timeout=1):
self._maxsize = maxsize
self._timeout = timeout
self._threads = []
self._work_queue = Queue.Queue()
self._create_threads()
def execute(self, func, *args, **kwargs):
self._work_queue.put((func, args, kwargs))
# self._append_thread()
def dismiss(self, do_join=False):
dismiss_list = []
for i in range(len(self._threads)):
thread = self._threads.pop()
thread.dismiss()
dismiss_list.append(thread)
if do_join:
for thread in dismiss_list:
thread.join()
def _create_threads(self):
for i in range(self._maxsize):
self._threads.append(WorkThread(self._work_queue, self._timeout))
# def _append_thread(self):
# num_thread = len(self._threads)
# if num_thread == self._maxsize:
# return
# num_work = self._work_queue.qsize()
# if num_thread >= num_work:
# return
# for i in range(num_thread, min(num_work, self._maxsize)):
# self._threads.append(WorkThread(self._work_queue, self._timeout))
class WorkThread(threading.Thread):
def init(self, work_queue, timeout=1):
super(WorkThread, self).init()
self._work_queue = work_queue
self._timeout = timeout
self._dismissed = threading.Event()
self.start()
def run(self):
while True:
if self._dismissed.isSet()
and self._work_queue.qsize() == 0:
break
try:
func, args, kwargs = self._work_queue.get(True, self._timeout)
except Queue.Empty:
continue
else:
func(*args, **kwargs)
# print("%s exited!" % threading.current_thread())
def dismiss(self):
self._dismissed.set()
if name == 'main':
import time
def do_sth(n):
time.sleep(0.1)
print("task%s in %s" % (n, threading.current_thread()))
pool = ThreadPool()
for i in range(0, 20):
pool.execute(do_sth, i)
pool.dismiss(True)
print("completed!")</pre>