マルチスレッドとは何か
マルチスレッドとは何か。
それをつかうと実行処理を並行させる事ができるのだそうだ。今回は触りだけ。
まずは次のコードから話をはじめます。
実行環境は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^ω^)