Python 簡易スレッドプール

(コメント)

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

gist: https://gist.github.com/ytyng/a3776b725e9ea771bca4

現在未評価

コメント

最近のツイート

  • ytyng

    ytyng @ytyng

    ホセ・リサール氏のマンガの反応が良い。 https://t.co/Lwqjx5nn8n #MANGACLUB @Mangadotclubさんから
    2 日, 14 時間 前

  • ytyng

    ytyng @ytyng

    Python の Typing で、Generator[MangazenkanOrderAdapter, None, None] は Iterator[MangazenkanOrderAdapter] とアノテーションをつけること… https://t.co/SqG9hOtEiF
    3 日, 16 時間 前

  • ytyng

    ytyng @ytyng

    近所に、スーパーバリューっていうスーパーがあるんだけど、店内にいるとたまにBGMが5拍子のアコースティックプログレみたいな音楽になる。めっちゃ耳に残る。あのBGMはなんか意味があるのかなー。
    4 日, 11 時間 前