Pythonのスレッドについて理解したのでまとめておく。
タイトル同じです。自分はまだ未熟なエンジニアで忘備録的な側面もありこの記事を書いています。smtpを用いてメール送信の処理を書いていたのですが、その処理が比較的重く次の処理に映るまでに時間がかかってしまっていました。そこで使ったのがスレッドです。
スレッドとは
スレッドとは2つの意味がありプログラムの処理の実行単位と、もう1つは某巨大掲示板におけるそれぞれのトピックスのことです。もちろん今回は前者です。スレッドが一番威力を発揮するのは,並列処理の際です。並列処理とは,コンピュータのプロセッサで1つのタスクを分割させることで,重い処理をするときに活躍します。
簡単なスレッドのプログラム
環境 macOs 訳あってpython2系ですが,ほとんど3系とコードは変わりません。詳しくはドキュメント等を参照していただきたいです。import threading
def thread_practice(n):
for i in range(n):
print ("thread : " + str(i))
if __name__ == '__main__':
t1 = threading.Thread(target=thread_practice, name="practice", args=(5,))
t1.start()
t1.join()
print ("end")
実行結果は
thread : 0
thread : 1
thread : 2
thread : 3
thread : 4
end
のようになります。threading,Threadの引数について軽く説明するとtargetでスレッドで実行する関数を指定し、nameがスレッドの名前空間、argsに実行する関数の引数を書くみたいです。またstart()でスレッドの開始をしています。join()は後ほど説明します。
これだけだと通常のfor文と違いが分かりませんね...
import threading
def thread_practice(n):
for i in range(n):
print ("thread : " + str(i))
if __name__ == '__main__':
t2 = threading.Thread(target=thread_practice, name="practice", args=(5,))
t2.start()
print ("end")
ここで先ほどまであったjoin()を書くのをやめてみましょう。そうすると結果は
thread : 0
end
thread : 1
thread : 2
thread : 3
thread : 4
というようになります。スレッドが終了する前に,endと出力されています。実は先ほどのjoin()はスレッドの終了を待つ操作で、mainのスレッドが実行中のスレッドが終了するのを待っていることが分かります。