KnowHow

技術的なメモを中心にまとめます。
検索にて調べることができます。

ThreadとQueue

登録日 :2023/11/18 11:26
カテゴリ :Python基礎

ThreadとQueueを使って、一時ファイルを読み込んだ後に、処理を並列で実行するサンプルプログラムを作成してみた。

import queue
import threading
import logging
import time

logging.basicConfig(
    level=logging.DEBUG, format='%(threadName)s: %(message)s')


def create_log_file(filename, num):
    with open(filename, 'w') as f:
        for i in range(num):
            f.write(f'{i} Hello\n')


def read_log_to_queue(filename) -> queue:
    logfile = queue.Queue()
    with open(filename, 'r') as f:
        rows = f.read().split('\n')

    for row in rows:
        # print(row)
        logfile.put(row)

    return logfile


def worker(_queue):
    logging.debug('start')
    while True:
        item = _queue.get()
        if item is None:
            break
        logging.debug(item)
        _queue.task_done()
    logging.debug('end')


if __name__ == '__main__':
    logging.debug('start')
    NUM_OF_THREAD = 10
    file_name = 'sample.log'
    # create_log_file(file_name, 100000)

    start = time.time()
    queue = read_log_to_queue(file_name)

    ts = []
    for _ in range(NUM_OF_THREAD):
        t = threading.Thread(target=worker, args=(queue,))
        t.start()
        ts.append(t)

    logging.debug('tasks are not done')
    queue.join()
    logging.debug('tasks are done')

    [queue.put(None) for _ in range(len(ts))]
    [t.join() for t in ts]

    end = time.time()
    logging.debug('end')
    print('thread time: {: 4f}\n'.format(end - start))