删除多线程库
This commit is contained in:
@@ -1,115 +0,0 @@
|
|||||||
# coding=utf8
|
|
||||||
|
|
||||||
"""
|
|
||||||
A simple thread pool
|
|
||||||
|
|
||||||
Usage:
|
|
||||||
|
|
||||||
pool = ThreadPool(size=10) # size: how many threads in pool [default: 1]
|
|
||||||
pool.start() # start all threads to work!
|
|
||||||
pool.append_job(myjob, *args, **kwargs)
|
|
||||||
pool.join() # wait all jobs done
|
|
||||||
pool.stop() # kill all threads in pool
|
|
||||||
"""
|
|
||||||
|
|
||||||
|
|
||||||
import threading
|
|
||||||
from Queue import Queue, Empty
|
|
||||||
|
|
||||||
# macros: thread's states
|
|
||||||
RUNNING = 1
|
|
||||||
STOPPED = 0
|
|
||||||
|
|
||||||
|
|
||||||
class ThreadWorker(threading.Thread):
|
|
||||||
|
|
||||||
def __init__(self, pool):
|
|
||||||
super(ThreadWorker, self).__init__()
|
|
||||||
self.pool = pool
|
|
||||||
# subthreads terminates once the main thread end
|
|
||||||
self.setDaemon(True)
|
|
||||||
self.state = STOPPED
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
self.state = RUNNING
|
|
||||||
super(ThreadWorker, self).start()
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
self.state = STOPPED
|
|
||||||
|
|
||||||
def run(self):
|
|
||||||
|
|
||||||
while self.state is RUNNING:
|
|
||||||
# don't use `Queue.empty` to check but use Exception `Empty`,
|
|
||||||
# because another thread may put a job right after your checking
|
|
||||||
try:
|
|
||||||
job, args, kwargs = self.pool.jobs.get(block=False)
|
|
||||||
except Empty:
|
|
||||||
continue
|
|
||||||
else:
|
|
||||||
# do job
|
|
||||||
try:
|
|
||||||
result = job(*args, **kwargs)
|
|
||||||
self.pool.results.put(result) # collect the result
|
|
||||||
except Exception, e:
|
|
||||||
self.stop()
|
|
||||||
raise e
|
|
||||||
finally:
|
|
||||||
self.pool.jobs.task_done()
|
|
||||||
|
|
||||||
|
|
||||||
class ThreadPool(object):
|
|
||||||
|
|
||||||
def __init__(self, size, result_queue):
|
|
||||||
self.size = size
|
|
||||||
self.jobs = Queue()
|
|
||||||
self.results = result_queue
|
|
||||||
self.threads = []
|
|
||||||
|
|
||||||
def start(self):
|
|
||||||
"""start all threads"""
|
|
||||||
for i in range(self.size):
|
|
||||||
self.threads.append(ThreadWorker(self))
|
|
||||||
|
|
||||||
for thread in self.threads:
|
|
||||||
thread.start()
|
|
||||||
|
|
||||||
def append_job(self, job, *args, **kwargs):
|
|
||||||
self.jobs.put((job, args, kwargs))
|
|
||||||
|
|
||||||
def join(self):
|
|
||||||
"""waiting all jobs done"""
|
|
||||||
self.jobs.join()
|
|
||||||
|
|
||||||
def stop(self):
|
|
||||||
"""kill all threads"""
|
|
||||||
for thread in self.threads: # stop all threads
|
|
||||||
thread.stop()
|
|
||||||
|
|
||||||
for thread in self.threads: # waiting completing
|
|
||||||
if thread.isAlive():
|
|
||||||
thread.join()
|
|
||||||
|
|
||||||
del self.threads[:]
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
'''Time this test should get about 1s'''
|
|
||||||
|
|
||||||
from time import sleep
|
|
||||||
|
|
||||||
thread_pool = ThreadPool(size=10, result_queue=Queue())
|
|
||||||
|
|
||||||
def job(i):
|
|
||||||
print "Hello! %d" % i
|
|
||||||
sleep(i)
|
|
||||||
|
|
||||||
return 1
|
|
||||||
|
|
||||||
thread_pool.start()
|
|
||||||
|
|
||||||
for x in range(10):
|
|
||||||
thread_pool.append_job(job, x)
|
|
||||||
|
|
||||||
thread_pool.join()
|
|
||||||
thread_pool.stop()
|
|
||||||
Reference in New Issue
Block a user