0
0

Pythonマルチスレッド検証

Last updated at Posted at 2024-07-21

PythonのマルチスレッドでSQLite3からデータを取得する検証

マルチスレッドでSQLite3からデータを取得する

1.参照するテーブルのレイアウト

  • test_db.sqlite3.large_data
列名 データ・タイプ
id INT
col1 INT
col2 TEXT
col15 TEXT

2.検証用コード

  • あらかじめ dataset をインストールしておくこと
pip install dataset
sqlite3_multi_thread.py
import concurrent.futures
import datetime
import traceback
import dataset

# 取得条件
CONDITIONS = [
    {'db': '1', 'min': '1', 'max': '1000000'},
    {'db': '2', 'min': '1000001', 'max': '1500000'},
    {'db': '3', 'min': '1500001', 'max': '3000000'},
    {'db': '4', 'min': '3000001', 'max': '4000000'},
    {'db': '5', 'min': '4000001', 'max': '5000000'}
]
# 取得条件要素数
ELEMENT_COUNT = len(CONDITIONS)
# DBパス
DB_PATH = '/Users/user/Documents/SQL/SQLite/3/'
# DBファイル名
DB_NAME = 'test_db.sqlite3'
# DBファイルパス
DB_STR = DB_PATH + DB_NAME
# テーブル名
TABLE_NAME = 'large_data'


def find_by_condition(arg):
    '''
    データベースから条件に基づきリストを取得する
    '''
    # DBに接続
    db = dataset.connect(f'sqlite:///{DB_STR}')
    # テーブル接続
    tbl = db[TABLE_NAME]

    print(datetime.datetime.now(), 'DB名', CONDITIONS[arg].get('db'), ':開始')
    print(datetime.datetime.now(), 'DB名', CONDITIONS[arg].get(
        'db'), '処理行数', CONDITIONS[arg].get('min'), 'から', CONDITIONS[arg].get('max'))

    # テーブルから条件に基づきリスト取得
    large_data_list = list(tbl.find(
        id={'between': (CONDITIONS[arg].get('min'), CONDITIONS[arg].get('max'))}))
    db.close()

    print(datetime.datetime.now(), 'DB名', CONDITIONS[arg].get(
        'db'), '処理データ件数:', len(large_data_list))
    print(datetime.datetime.now(), 'DB名', CONDITIONS[arg].get('db'), ':終了')

    return large_data_list


def main():
    '''
    主処理
    '''
    print('処理開始:', datetime.datetime.now())
    print('---------------')
    print('マルチプロセス開始:', datetime.datetime.now())
    print(ELEMENT_COUNT)

    # マルチプロセスで処理実行
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = {executor.submit(
            find_by_condition, arg): arg for arg in range(0, ELEMENT_COUNT, 1)}

        for future in concurrent.futures.as_completed(futures):
            print(future.result()[0])

    print('マルチプロセス終了:', datetime.datetime.now())
    print('---------------')
    print('処理終了:', datetime.datetime.now())


try:
    if __name__ == "__main__":
        main()

except Exception:
    print('処理終了:', datetime.datetime.now())
    traceback.print_exc()
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0