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

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

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

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

8020閲覧

[Flask] ボタンでスレッドの開始と終了をコントロールさせる方法

horik

総合スコア44

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2016/10/24 07:13

編集2016/10/24 07:17

やりたいこと

フォーム入力でなにかしらwebサービスのログイン情報を登録。
登録した情報の一覧画面で、アカウント情報の横にはボタンがあって、
開始ボタンを押したら何かしらの処理をスレッドで実行。
終了ボタンを押したら処理を停止させる。

という感じのwebアプリを作りたいと思っています。

行き詰まっていること

スレッドの開始は簡単にできたのですが、
いま動いている特定のスレッドを指定して停止させる方法がわかりません。

質問

以下のソースで、
/start?name=○○○
にアクセスしたらスレッドを実行。
/stop?name=○○○
にアクセスしたら、スタート時にgetで送ったnameのスレッドを停止させる。

これを実現するにはどのようにコーディングすればいいでしょうか?

python

1from flask import Flask, request 2from threading import Thread, Semaphore 3from datetime import datetime 4import time 5 6app = Flask(__name__) 7sem = Semaphore(5) 8 9 10def main(semaphore, name): 11 with semaphore: 12 while True: 13 time.sleep(1) 14 print(name + ': ' + str(datetime.today())) 15 16 17@app.route('/') 18def index(): 19 return 'index' 20 21 22@app.route('/start') 23def start(): 24 name = request.args.get('name') 25 if name: 26 th = Thread(target=main, args=(sem, name)) 27 th.start() 28 return name + ' started.' 29 return 'スレッド名を入力してください。' 30 31 32@app.route('/stop') 33def stop(): 34 name = request.args.get('name') 35 if name: 36 # 停止する処理 37 return name + ' stopped.' 38 return '停止したいスレッド名を入力してください。' 39 40 41if __name__ == '__main__': 42 app.run() 43

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

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

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

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

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

guest

回答1

0

自己解決

以下で実現できました。

python

1from flask import Flask, request 2import threading 3from datetime import datetime 4import time 5 6app = Flask(__name__) 7 8 9class StoppableThread(threading.Thread): 10 def __init__(self, target, name): 11 super(StoppableThread, self).__init__(target=target, name=name) 12 self._stop = threading.Event() 13 14 def run(self): 15 while not self._stop.is_set(): 16 time.sleep(1) 17 print(threading.currentThread().getName() + ': ' + str(datetime.today())) 18 19 def stop(self): 20 self._stop.set() 21 22 def stopped(self): 23 return self._stop.isSet() 24 25 26def get_thread_by_name(name): 27 threads = threading.enumerate() 28 for thread in threads: 29 if thread.getName() == name: 30 return thread 31 return None 32 33 34@app.route('/') 35def index(): 36 return 'index' 37 38 39@app.route('/start') 40def start(): 41 name = request.args.get('name') 42 if name: 43 if not get_thread_by_name(name): 44 th = StoppableThread(target=StoppableThread, name=name) 45 th.start() 46 return name + ' started.' 47 return '同名のスレッドが存在します' 48 return 'スレッド名を入力してください。' 49 50 51@app.route('/stop') 52def stop(): 53 name = request.args.get('name') 54 if name: 55 thread = get_thread_by_name(name) 56 if thread: 57 thread.stop() 58 return name + ' stopped.' 59 return '停止したいスレッド名を入力してください。' 60 61 62if __name__ == '__main__': 63 app.run() 64

投稿2016/10/24 13:00

horik

総合スコア44

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問