0
Help us understand the problem. What are the problem?

posted at

updated at

Python で非 async な IO 処理を並列したい場合

概要

Python で並列処理したい場合は asyncio が便利だが、EventLoop が設定しづらかったり、IO自体が async 対応してなかったり(つまりIO終わるまで制御を握ってしまう)などの場合、純粋に並列処理したい場合がある。
その場合の方法をメモしておく。

方法

from concurrent.futures import ThreadPoolExecutor

def main():
    target_file_list = [
        'file1.dat',
        'file2.dat',
    ]
    # 平行して呼び出し
    with ThreadPoolExecutor() as executor:
        threads = [
            executor.submit(hoge.some_io_process, target_file)
            for target_file in target_file_list
        ]
        results = [
            th.result()
            for th in threads
        ]
    return results

注意点:executor.submitlambda を渡してはいけない。

下記のように lambda を渡すと target_file がループにより変わってしまい、
lambda が実行する段階では後半の(タイミング次第ではすべての)実行で
最後のファイルを参照することになってしまう。

NGの例
            executor.submit(
                lambda: hoge.some_io_process(target_file)
            )
            for target_file in target_file_list

Register as a new user and use Qiita more conveniently

  1. You can follow users and tags
  2. you can stock useful information
  3. You can make editorial suggestions for articles
What you can do with signing up
0
Help us understand the problem. What are the problem?