pythonでDNSサーバ作成 ~⑥スレッド処理を実装しよう~

DNSサーバ作成,python,thread

今回はpythonのthreadingライブラリを使用して、DNSサーバのsocket処理とGUI処理を両立させられるようなスレッド処理を実装します。

実装内容

以前UDPサーバ処理実装時に、スレッド処理を実装しないとサーバ起動中は停止ボタンを受け付けることができないことを課題として挙げた。

実際にサーバ起動後停止ボタンを押してみると以下のような画面になり固まってしまう。

そのため、UDPサーバ起動中も停止ボタンを受け付けて、socket処理を終了させられるようにする必要があります。

処理の説明

サーバ起動ボタン押下後の、UDPソケットOPEN関数呼び出しを以下のようにする。

# スレッドオブジェクトの生成
thread1 = threading.Thread(target=udp.udp_open, args=(values["ip4"], values,))
# デーモンの設定
thread1.setDaemon(True)
# スレッド処理の開始
thread1.start()

スレッドオブジェクトの生成

スレッドを使用する関数はtarget、引数はargsで指定する。

デーモンの設定

残っているスレッドがデーモンスレッドだけになった時に Python プログラム全体を終了させるという意味がある。

今回はOPENしているUDPソケットを閉じるため、以下のような流れになる。

 (1) ×ボタン押下
 (2) ウィンドウクローズ
 (3) UDPサーバ処理(デーモンスレッド)が起動し続けている
 (4) デーモンによりプログラム停止

仮にデーモンの設定を行わなかった場合、ウィンドウは消えるがDNSサーバは起動したままとなる。

スレッド処理の開始

今回使用しなかったが、thread1.join()によってthread1の処理完了を待ち合わせることも可能。

参考サイト

以下サイトが参考になりました。

pythonのスレッドについて詳しく知りたい方はこちら。

コード

最終的なDNSサーバコードは以下にあります。(詳細については関連記事参照)