2

情報の膨大なリストがあり、私のプログラムはそれらのそれぞれを分析する必要があります。スピードアップするには、スレッドを使用したいのですが、スレッドを 5 つに制限したいと考えています。そのため、5 つのスレッドでループを作成し、1 つのスレッドがジョブを終了したら、リストの最後まで新しいスレッドを取得する必要があります。しかし、私はそれを行う方法の手がかりがありません。キューを使用する必要がありますか? 今のところ、最も簡単な方法で 5 つのスレッドを実行しています。ありがとうございます。

for thread_number in range (5):
    thread = Th(thread_number)
    thread.start()
4

2 に答える 2

2

ワーカー スレッドとタスクの概念を分離します。1 つのタスクで 1 つのワーカーを動作させてから、スレッドを終了させないでください。代わりに、5 つのスレッドを生成し、すべてのスレッドが共通のキューからタスクを取得できるようにします。終了するように指示するセンチネルをキューから受信するまで、それぞれに反復させます。

これは、スレッドが 1 つのタスクを完了した後でスレッドを継続的に生成および終了するよりも効率的です。

import logging
import Queue
import threading
logger = logging.getLogger(__name__)
N = 100
sentinel = object()

def worker(jobs):
    name = threading.current_thread().name
    for task in iter(jobs.get, sentinel):
        logger.info(task)
    logger.info('Done')


def main():
    logging.basicConfig(level=logging.DEBUG,
                            format='[%(asctime)s %(threadName)s] %(message)s',
                            datefmt='%H:%M:%S')

    jobs = Queue.Queue()
    # put tasks in the jobs Queue
    for task in range(N):
        jobs.put(task)

    threads = [threading.Thread(target=worker, args=(jobs,))
               for thread_number in range (5)]
    for t in threads:
        t.start()
        jobs.put(sentinel)     # Send a sentinel to terminate worker
    for t in threads:
        t.join()

if __name__ == '__main__':
    main()
于 2013-06-27T14:28:04.910 に答える