celery
労働者は仕事の結果をフラスコに返すのですか? 私はタスクを呼び出すフラスコのアプリを持っています。このタスクは、データベースからデータを取り出し、折れ線グラフをプロットし、htmlページにレンダリングされるhtmlコンテンツを返します。 Celeryを使用しない場合、Flaskアプリケーションはうまく動作し、クライアント側で折れ線グラフをレンダリングしますが、セロリをRabbitMQ
ブローカ経由で実行するよう委任したいので、セロリシェルのログ出力を見ることができますが、フラスコサーバーアプリに送り返されます。どうやってするか?セラーリー作業員がタスクから結果を返す方法
#server-celery.py
app = Flask(__name__)
@app.route('/',methods=['GET'])
def index():
return render_template("index.html")
@app.route('/', methods=['GET', 'POST'])
def plotdata():
form = InputForm(request.form)
if request.method == 'POST' and form.validate():
lineChart = task.main.delay(form.startdate.data, form.enddate.data)
return render_template('view.html', form=form, result= lineChart)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000, debug=True)
そしてCelery
労働者として実行中のタスク:
#task.py
from celery import Celery
broker = 'amqp://localhost:5672'
app = Celery(__name__, broker=broker)
def queryDatabase(param1, param2):
#query database, return results
return data
def plotLineChart(data):
#plot data as line Chart
return LineChartHtmlcontent
@app.task
def main(param1,param2):
data = queryDatabase(param1,param2)
return plotLineChart(data)
とクライアントのhtmlページ:
<!--view.html-->
<form method=post action="">
<table>
{% for field in form %}
<tr>
<td>{{ field.label }}</td>
<td>{{ field }}</td>
</tr>
{% endfor %}
</table>
<p><input type=submit value=Submit></form></p>
<p>
{% if result != None %}
<img src="{{ result }}" width="500">
{% endif %}
</p>
:あなたは
.delay()
はミゲルgrinbergによって優れたチュートリアルを参照してください呼び出した後は、
lineChart.id
を使用してタスクIDを取得することができますか?これは、バックラウンドで長時間実行されるタスクを実行するためのものです。 – davidismこのメソッドを使用することができます http://docs.celeryproject.org/en/latest/reference/celery.result.html#celery.result.AsyncResult.get この場合、セロリを使用するポイントは何ですか?結果が返されるまで実行をブロックします。そしてセロリを使用する主な理由は、バックグラウンドでタスクを実行することです。結果をどこかに保存する方がよいでしょう。 –
@davidismそのフォローアップのhttp://stackoverflow.com/questions/37839551/how-to-restart-flask-process-by-refreshing-page/38146003#38146003 – ArchieTiger