---
slug: "Python簡易スレッドプール"
title: "Python Simple Thread Pool"
description: "\n\nI should have used multiprocessing.pool.Pool orz"
url: "https://www.ytyng.com/en/blog/Python簡易スレッドプール"
publish_date: "2015-10-16T07:35:00Z"
created: "2015-10-16T07:35:00Z"
updated: "2026-02-27T10:43:46.125Z"
categories: ["Python"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/bd640c9060304dc6bc64dbdda7f3c647.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "en"
---

# Python Simple Thread Pool

<div class="document">

<p>I should have used multiprocessing.pool.Pool orz</p>
<pre class="literal-block">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()
</pre>
<div class="section" id="id1">
<h3>Execution Result</h3>
<pre class="literal-block">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
</pre>
<p>gist: <a class="reference external" href="https://gist.github.com/ytyng/a3776b725e9ea771bca4">https://gist.github.com/ytyng/a3776b725e9ea771bca4</a></p>
</div>
</div>
