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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1195閲覧

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

dam9806

総合スコア21

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2018/11/12 07:13

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

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

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

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

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

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

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

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

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

投稿2018/11/12 07:59

takasima20

総合スコア7458

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dam9806

2018/11/12 08:21

回答ありがとうございます。 対応方法について、参考にさせていただきます。 ツールはWebAPIです。HTTPリクエストを受け取りレスポンスを返します。 ツールは並列実行するつもりです。複数のプロセスが生じることになります。 ツールの中で、ネットショップが提供するWebAPIを利用するのですが、複数ある利用アカウントのどれを使うかをコントロールすべく、質問文に記載したようなアカウント利用状況を示すカラムを用意しています。 独自のキャンセル処理を設けることの当面の目的は、開発中に強制終了すると利用中の状態が残ってしまい、手動で未使用のステータスに戻すのが面倒だからです。 また、別のツールで、GUIにてキャンセル処理を実装することも考えており、その際にも当質問の回答を参考にさせていただこうと考えています。
guest

0

ベストアンサー

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

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

投稿2018/11/12 08:20

編集2018/11/12 08:22
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dam9806

2018/11/12 08:25

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

2018/11/12 13:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問