Python 簡易スレッドプール

Python
2015-10-16 07:35 (10 years ago)
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

まだ評価がありません
著者は、アプリケーション開発会社 Cyberneura を運営しています。
開発相談をお待ちしています。

アーカイブ