Skip to content

Instantly share code, notes, and snippets.

@ytyng
Last active October 16, 2015 07:29
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save ytyng/a3776b725e9ea771bca4 to your computer and use it in GitHub Desktop.
Save ytyng/a3776b725e9ea771bca4 to your computer and use it in GitHub Desktop.
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()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment