質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.59%

pythonプログラムで独自のキャンセル処理を行いたい

解決済

回答 2

投稿

  • 評価
  • クリップ 1
  • VIEW 993

dam9806

score 18

pythonでツールを作っています。
pythonコーディング経験は2ヶ月ほどです。

予めツール使用アカウントを管理するためのテーブル(DBはMariaDB)を作成しています。
当該テーブルには、アカウント利用状況を示すカラムを保持しています。

以下の構想を描いています。

  1. ツールの初期処理にて、アカウント利用状況を「使用中」に変更。
  2. 正常終了、異常終了、キャンセル終了のいずれにおいても、アカウント利用状況を「未使用」に変更。

2.のキャンセル終了について相談したく。

私は今のところ、実行中のpythonプログラムのキャンセル(強制終了)を Ctrl-C や kill コマンドなどで行っています。このキャンセル方法では、上記構想のとおり、アカウント利用状況を「未使用」に変更することはできないと思います。

私なりに以下を考えたのですが、
「DBに専用フラグ持たせて、ツールはそのフラグで継続・キャンセルを判断する」
この方式だと、DBアクセスが多発することで、ツールの処理速度に悪影響を与えかねません。

もし、Pythonプログラムにキャンセル判定用の変数を設けて、実行中のプロセス以外からその値を変えることができれば、一応思いどおりのキャンセル処理を実現できそうですが、そんなことは可能でしょうか?

環境:Windows7, CentOS7.2, Python3.6, MariaDB, VSCodeで開発

構想を実現するためのヒント等をお示しいただけると嬉しいです。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

Python でなく PHP で Webシステム作ってたときに
あるものの編集の競合を防ぐために、質問者さんと
同じような仕掛けを作りこみましたが…
ブラウザでを終了されると同様のことがありましたねえ。

結局、権限持たせてるユーザーなら解除できる
仕掛けを作ったり、cron で定期的に一定以上の期間
編集状態のものを解除したりって感じで対処しました。

そちらのツールがどういったものか分かりませんが、
もう少し具体的なものを追記されたら、もっと違った
アドバイスがでてくるかも?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/12 17:21

    回答ありがとうございます。
    対応方法について、参考にさせていただきます。

    ツールはWebAPIです。HTTPリクエストを受け取りレスポンスを返します。
    ツールは並列実行するつもりです。複数のプロセスが生じることになります。
    ツールの中で、ネットショップが提供するWebAPIを利用するのですが、複数ある利用アカウントのどれを使うかをコントロールすべく、質問文に記載したようなアカウント利用状況を示すカラムを用意しています。

    独自のキャンセル処理を設けることの当面の目的は、開発中に強制終了すると利用中の状態が残ってしまい、手動で未使用のステータスに戻すのが面倒だからです。

    また、別のツールで、GUIにてキャンセル処理を実装することも考えており、その際にも当質問の回答を参考にさせていただこうと考えています。

    キャンセル

checkベストアンサー

0

  • キャンセル終了はできる限り正常系で拾う。Ctrl-C、killあたりはSIGINTとSIGTERMなので拾えると思います。kill -9は無理。

  • どうしようもないの(kill -9とか途中でクラッシュして死んじゃったとか)はタイムアウトさせる方針で。セッションを管理するためにデーモンを常駐させても良いでしょうし、単にDBに数秒おきにタイムスタンプを書くことにするみたいな方針でもやれなくはないでしょう。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/11/12 17:25

    ありがとうございます!
    SIGINT、SIGTERMってはじめて知りましたが、検索したら参考になりそうな記事が出てきました。
    トライしてみます!

    キャンセル

  • 2018/11/12 17:47

    もうたどり着いているかもしれませんが、pythonだと標準のsignalモジュールで比較的簡単に拾えると思います。
    https://docs.python.jp/3/library/signal.html

    キャンセル

  • 2018/11/12 22:42

    参考サイトまでお示しいただき、ありがとうございました!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.59%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る