よちよちpython

独習 python/Qpython/Pydroid3/termux/Linux

マルチスレッドとは何か

マルチスレッドとは何か。



それをつかうと実行処理を並行させる事ができるのだそうだ。今回は触りだけ。

まずは次のコードから話をはじめます。
実行環境はJupyterNotebook。

%%time
# ↑ 実行時間計測のマジックコマンド

print("スタート!")
print("ストップ!")
スタート!
ストップ!
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 684 µs

実行すれば、2つのprint()関数で表示するのに1秒も掛からない。
print("スタート!")が実行されたら、次の行のprint("ストップ!")が実行される。

そしたら次、3秒経ってストップ!と言わせてみる。

%%time
print("スタート!")

time.sleep(3)

print("ストップ!")
スタート!
ストップ!
CPU times: user 20 ms, sys: 0 ns, total: 20 ms
Wall time: 3 s

「スタート!」と表示され、3秒待ってから「ストップ!」が表示された。



では次、スタートとストップの行を入れ換える。

%%time
print("ストップ!")
print("スタート!")
ストップ!
スタート!
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 1.02 ms

当たり前だか、即座に2行の表示を終える。

ここで、「ストップ!」を3秒待って発言させてみます。

%%time
import time


time.sleep(3)
print("ストップ!")

print("スタート!")
ストップ!
スタート!
CPU times: user 0 ns, sys: 0 ns, total: 0 ns
Wall time: 3.01 s

実行して3秒経ってから「ストップ!」「スタート!」がほぼ同時に表示された。
ほぼ同時だが、上の行が実行を終えて、次の行の実行に移る。
表示の順番も、当たり前だが行順に、ストップ→スタート。



本題のマルチスレッドはここから



「ストップ!」 → 「スタート!」の順で書いたまま、ストップだけ3秒後に表示させられるか。



ここで登場するのが、threadingというライブラリ。
通常、プログラムは上から一行ずつ1つの仕事を順番にこなしていく。

「釘を打て」
「ノコギリで切れ」


と書いてあれば、打ち終えてから切り始める。
これをシングルスレッドという。



threadingを使うと、左手で「釘を打ち」ながら、同時に右手で「ノコギリで切る」ような器用な事をやれるようになる。
または、2匹の犬にほぼ同時に餌を与えたが、片方には「待て」を掛けて待機させているような状態。



下記のコードでは、「ストップ!」表示まで3秒待ちを実行しながら、次の「スタート!」表示の命令を実行。スレッドが並行して複数で実行されるのでマルチスレッド

%%time
import threading, time

# 呼ばれると3秒まってprintする
def sayStop():
    time.sleep(3)
    print("ストップ!")
    
kiyou_na_mane = threading.Thread(target = sayStop)
kiyou_na_mane.start()

print("スタート!")
スタート!
CPU times: user 10 ms, sys: 0 ns, total: 10 ms
Wall time: 3.2 ms
ストップ!

「ストップ!」 → 「スタート!」が逆転して表示された。

スタート!表示
→ 3秒
→ ストップ!

マルチスレッドは、身近な例でいくとブラウザでダウンロードしながら一方で表示するとか、複数のファイルを同時にダウンロードする機能の実現などに使われているのだとか。
しかし一方で並行処理問題という、ややこしい困難をはらんでいて注意が必要とのこと。

以上です。(U^ω^)