I should have used multiprocessing.pool.Pool orz
import time import threading from queue import Queue class ThreadPool(object): def __init__(self, pool_size=10): self.pool_size = pool_size self.jobs = [] self.job_queue = Queue() self.result_queue = Queue() def add_job(self, job): self.jobs.append(job) def run(self): def worker(): while True: job = self.job_queue.get() self.result_queue.put(job()) self.job_queue.task_done() for i in range(self.pool_size): t = threading.Thread(target=worker) t.daemon = True t.start() for job in self.jobs: self.job_queue.put(job) self.job_queue.join() def results(self): while not self.result_queue.empty(): yield self.result_queue.get() def demo(): def demo_job(job_id): def _job(): print('Start:', job_id) time.sleep(1) print('End:', job_id) return 'Return: {}'.format(job_id) return _job thread_pool = ThreadPool(4) for i in range(10): task = demo_job(i) thread_pool.add_job(task) thread_pool.run() for i in thread_pool.results(): print(i) if __name__ == '__main__': demo()
Start: 0 Start: 1 Start: 2 Start: 3 End: 0 End: 1 Start: 4 End: 3 Start: 5 Start: 6 End: 2 Start: 7 End: 4 Start: 8 End: 7 Start: 9 End: 5 End: 6 End: 8 End: 9 Return: 1 Return: 3 Return: 0 Return: 2 Return: 4 Return: 7 Return: 5 Return: 6 Return: 8 Return: 9
Comments