0
サーバーで開始されたプロセスを識別するためにデータをデータベースに格納する方法を教えてください。サーバーで開始されたプロセスを識別するためにデータベースにデータを格納する方法
コードは以下のとおりです。
は、私は、プロセスが、データベースを識別するために、セッションクッキーを使用したくない、アップ溜めにクラウド9
上のMySQLデータベースとのフラスコ(パイソン)上で実行します。
from multiprocessing import Process
from time import sleep
import psutil
from flask import Flask, redirect, session, url_for
app = Flask(__name__)
app.secret_key = 'f\xa9\x85\xf0\xe9\x982\xc4\xf8\xa0k\x91\xa7\xef\x12y'
@app.route('/')
def index():
return (
'<form action="/work/start" method="POST">'
'<input type="submit" value="Start">'
'</form>'
'<form action="/work/stop" method="POST">'
'<input type="submit" value="Stop">'
'</form>'
)
def work_it():
while True:
print('working...')
sleep(1)
@app.route('/work/start', methods=['POST'])
def start_work():
if 'work_process' not in session:
process = Process(target=work_it)
process.start()
pid = process.pid
parent_pid = psutil.Process(process.pid).parent().pid
session['work_process'] = (parent_pid, pid)
return redirect(url_for('index'))
@app.route('/work/stop', methods=['POST'])
def stop_work():
if 'work_process' in session:
parent_pid, pid = session['work_process']
try:
process = psutil.Process(pid)
if process.parent().pid == parent_pid:
process.terminate()
except psutil.NoSuchProcess:
pass
session.pop('work_process')
return redirect(url_for('index'))
停止ボタンを押して終了できるようにしたいと思います。 – Lucas
すでに開始されているときにプロセスを終了できるとは思いません。あなたが本当にそれをしたいのであれば、私にはあなたのための選択肢がありますが、それは最良の解決策ではないかもしれません。 – Cyrus
プロセスに関する情報を保持するテーブルを作成します。プロセスを実行しているときにテーブルを確認してください。ユーザーが停止を押すと、状況をデータベースのキャンセルに更新します。ステータスを5秒ごとに確認するようにコードを修正します(プロセスの経過時間によって異なります)。ステータスが「キャンセル」の場合は例外をスローするか何かを行うと、現在のプロセスが停止します。あまり頻繁にチェックしないでください、私はパフォーマンスの問題があると思う。 – Cyrus