ワーカー スレッドとタスクの概念を分離します。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()