Ccmmutty logo
Commutty IT
3 min read

Pythonの並行処理を一番わかりやすく(サンプルコードあり)

https://picsum.photos/seed/1b1399a3e8b0463f810fe65b27b99cd5/600/800
こちらの記事(Pythonの並行処理を理解したい [マルチスレッド編])を参考にさせていただきました
一つの関数に引数があるときにうまくいかなかったのでそのメモとして書きます。
★★★この記事は簡単に使い方をまとめたものです。メリットだけではないので上の記事など読むことをおすすめします。★★★

並行して実行したい関数に引数がないとき

python
from concurrent.futures.thread import ThreadPoolExecutor
import time

# 待つ関数を3つ用意する。
def wait_one_second():
    time.sleep(1)
    print("1秒間待つ処理が終了しました。")

def wait_five_seconds():
    time.sleep(5)
    print("5秒間待つ処理が終了しました。")

def wait_ten_seconds():
    time.sleep(10)
    print("10秒間待つ処理が終了しました。")


# それらを束ねる関数を、普通に処理する場合と、並行処理する場合、それぞれ作る。
def run_normally_without_arg():
    """ 普通に処理する場合 """
    wait_ten_seconds()
    wait_five_seconds()
    wait_one_second()

def run_concurrent_without_arg():
    """ 並行処理する場合 """
    with ThreadPoolExecutor() as executor:
        executor.submit(wait_ten_seconds)
        executor.submit(wait_five_seconds)
        executor.submit(wait_one_second)
python
run_normally_without_arg()
10秒間待つ処理が終了しました。 5秒間待つ処理が終了しました。 1秒間待つ処理が終了しました。
python
run_concurrent_without_arg()
1秒間待つ処理が終了しました。 5秒間待つ処理が終了しました。 10秒間待つ処理が終了しました。

並行して実行したい関数に引数があるとき

例えばexecutor.submit(wait_some_seconds, 10, "おけ")のように
executor.submit(実行したい関数, 第一引数, 第二引数,・・・)とする
Pythonのドキュメントがこちら
python
from concurrent.futures.thread import ThreadPoolExecutor
import time

def wait_some_seconds(length_in_second,word):
    time.sleep(length_in_second)
    print(f'{length_in_second}秒間待つ処理が終了しました。 第二引数→{word}')

def run_normally_with_arg():
    """ 普通に処理する場合 """
    wait_some_seconds(10, "あ")
    wait_some_seconds(5, "い")
    wait_some_seconds(1, "う")

def run_concurrent_with_arg():
    """ 並行処理を行う関数 """
    with ThreadPoolExecutor() as executor:
        executor.submit(wait_some_seconds,10,"あ")
        executor.submit(wait_some_seconds,5,"い")
        executor.submit(wait_some_seconds,1,"う")
python
run_normally_with_arg()

10秒間待つ処理が終了しました。 第二引数→あ
5秒間待つ処理が終了しました。 第二引数→い
1秒間待つ処理が終了しました。 第二引数→う
10秒間待つ処理が終了しました。 第2引数→あ 5秒間待つ処理が終了しました。 第2引数→い 1秒間待つ処理が終了しました。 第2引数→う
python
run_concurrent_with_arg()

Discussion

コメントにはログインが必要です。