概要
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.submit
に lambda
を渡してはいけない。
下記のように lambda
を渡すと target_file
がループにより変わってしまい、
lambda
が実行する段階では後半の(タイミング次第ではすべての)実行で
最後のファイルを参照することになってしまう。
NGの例
executor.submit(
lambda: hoge.some_io_process(target_file)
)
for target_file in target_file_list