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のスレッドが実行中のスレッドが終了するのを待っていることが分かります。
これを使うとできること。
Webページのお問い合わせフォームなどで,入力されたメールアドレスに自動で返信をする場合などがあると思いますが、比較的メール送信の処理は時間がかかり、ユーザーが数秒間待たないと完了ページにたどり着かないことが多々あります。
そこでメール送信などの重い処理をスレッドに割り振ることで、終了を待たずに次の処理に進めます。いくつかの重い処理をマルチスレッドで並列に処理させるのも良いと思います。
何か間違いなどのご指摘あればお願い致します。