dmypymypyのdmypyの実装の仕方を把握する。知りたいことは裏側でのprocessの管理の仕方とクライアントとサーバー間のデータのやり取りの仕方。data_files=data_files,...mypy.dmypy:main()がエントリーポイント実際のファイル。main.pyほとんどargparseを触っているだけ。中の実装もサブコマンドを定義するという上では必要十分そうな感じ。--help)."""興味の有りそうなコマンドを見てみるstatusstartrunstoprestartkilldaemonほとんど全部だった。processの開始はstart,run,restart。バックグラウンドジョブではなくフォアグラウンドジョブとして立ち上げるにはdaemon。statusstatushの実装はdo_status。running")read_statusがどういう実装なのかと言うのが気になるところ。check_status(data)なるほど。'.dmypy.json'こういう感じのJSONが格納される。"/tmp/tmptadv4ddn/dmypy.sock"}終わったらcheck_status()に渡される。JSON中にpidがなかったらBadStatus取得したpidのprocessに対して0を送っている。-0killに渡すsignalの一覧に0はない。SIGRTMAXただ、これが何かはmanに書いてある。processの存在確認に使われる。内部的にはunixドメインソケットがあるだけ(.dmypy.jsonのsocket_nameを見ればわかる通り)。これにJSONをsendしている。sock.close()この辺の定数はお約束感あるのだけれど。どこかで一度ソケットプログラミングとかの本などを読んでみると。portのcloseみたいな感じhttps://docs.python.jp/3/library/socket.html#socket.socket.shutdownちなみにここだけみてもどうやってデータが返ってきているかはわからない(戻り値はdictなのに)。receiveも覗かないとダメ。雑にデータを取り出して取りきったらJSONとしてdeserializeしているだけですね。datastartclientの方を覗いた経験から幾つか振る舞いが予想できる。以下のことをしている。start_server(args)存在チェックにBadStatusのelseを使っているのはわかりやすい(既に立ち上がっているならget_statusは通るはずで。ファイルが存在しなければBadStatusになる)。いう心配りの欠けたコマンドを書いてしまって使いづらいやつになったりする。内部的にはほぼほぼstart_server。wait_for_server()daemonizeも自分で実装しているっぽい。importはまぁそうだよねというかんじ(なんでserver,client形式にしてbagroundにserverを立ち上げる形のコマンドにしたのかという話だし)。wait_for_serverだけ先に見ておく。裏側のdaemonの立ち上がりを確認してから終了したいので、立ち上がるまで待つという感じ。このようにすると、このクライアントのstartコマンドの終了=バックグラウンドプロセスの立ち上がりとなるのでとても具合が良い。start")やっていることは簡単でtimeout(5秒)になるまで0.1秒ずつ待ちながらポーリングしている形。正常に立ち上がったら.dmypy.jsonができるはずだし。BadStatusは返ってこなくなるはずなので。daemonの起動daemonizeの部分、そういえばこれもけっこうたまに見る慣習(的な知識になってしまっている)。sys.exit(1)終了ステータスをそのまま返しているのかな。実際に中のコードを覗いてみる。これ説明するのも面倒だけれど。いわゆるdaemonizeの処理。コメントにstackoverflowへのリンクが貼ってあるのが良い。https://stackoverflow.com/questions/473620/how-do-you-create-a-daemon-in-pythonPEPにもそれ関連の提案があるらしい(PEP3143)。statusはdeferredなので延期されてしまってるけれど(詳しいPEPのstatus遷移はPEP1に)unixドメインソケットが出てきたときも思ったけれど。いえばwindowsには対応していなさそう。forkと呼ばれているもの。このあたりは絶対自分で書いてメンテしたくないので標準ライブラリに入って欲しい。PEP3143の実装提案自体はpypiにpython-daemonとして存在するのでしばらくはこちらを使うと良さそう。Serverの実装daemonizeに関しては脇道だったので本体の実装の方を見る。これはmypy.dmypy_serverに存在する。今までのコードを見てきたイメージとして入力としてJSONを受取りJSONを返すというようなもの。router的なものが存在して、分岐した後にそれぞれのコマンドに対応したhandler的なものが存在する感じ何じゃないかと思う。traceback.print_exception(*exc_info)至って普通のserverのコード。通信用のソケットの生成も先程のServerクラスのcreate_listening_socket()でやっている。sockrouting部分routing部分は先程のServerクラスのrun_command()でやっている。単純にcmd_のprefixを付けて、その名前のメソッドを呼ぶだけ。(ちなみにprefix付けずに呼んじゃえば良いじゃんという話があるかもしれないけれど。**data)stopstopはと言うと、stopコマンドを呼んでいるだけ。stopped")daemondaemonで最後にする。これはバックグラウンドで通常作られるdaemonをフォアグラウンドで起動したいと言うようなコマンド。中を見たらすぐわかるという感じ。timeout=args.timeout).serve()疲れたのでおしまい。手触りの良いscriptというものについて最近考えている。componentという機能を追加した月別アーカイブはてなブログをはじめよう!podhmoさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。