2017-10-19 8 views
0

私はセロリの作業を開始できるフラスコのアプリケーションを持っています。この作業は、私が一度だけ起動したいデーモンのようなものです。だから私が望むのは、その状態を監視し、タスクなどから何らかのメッセージを表示することです。これはすべてうまくいきます。セロリのタスクが既に起動しているかどうかを知る方法

私はそれを行う方法を理解できませんが、フラスコのアプリケーションでは、起動後にタスクIDを取得する方法があります。私ができる仕事を始めたら

@main.route('/start', methods=['POST']) 
def start(): 
    task = long_task.apply_async() 
    # from here I know the id with 'task.id' 
    return jsonify({}), 202 

私は仕事のIDを持っています。

ここで、セロリサーバーを再起動したり、タスクを終了したとします。そのようなタスクが実行されているかどうかを確認するにはどうすればよいですか?それが実行されている場合、どのようにIDを取得できますか?

@main.route('/', methods=['GET', 'POST']) 
def index(): 
    """Renders the home page.""" 
    _t = celery.current_task 
    if _t is not None: 
     t_id = toto.request.id 
    return render_template('main/index.html', title='Main page') 
:私はタスクIDを取得することができれば、セロリサーバを実行してフラスコアプリケーションを実行し、フラスコアプリケーションwhithinからセロリタスクを開始、見にメインページをリロードします。今の私が試した何

でも、_tの変数は、セロリ・タスクが実行中であっても常にNoneです。

+0

これはCeleryを使用する悪い方法であり、長い実行中のタスクを1つホストするように設計されていないことに注意してください。あなたがここで何を求めているか正確に分かります。おそらく、['Manager'](https://docs.python.org/3/library/multiprocessing.html#managers)が必要です。 – davidism

+0

どのバックエンドで使用していますか? – georgexsh

+0

セレスリーバックエンド用のredis – GuillaumeA

答えて

0

セロリAPIを使用して行う方法の1つは、control clientです。それはあなたが)あなたのタスクがすでに実行されている場合(タスク名で)見つけるために、このタスクの配列を反復処理し、それは状態だ取り出すことができ

i = app.control.inspect() 
i.reserved() 

#output: 
[{'worker1.example.com': 
    [{'name': 'tasks. long_task', 
     'id': '32666e9b-809c-41fa-8e93-5ae0c80afbbf', 
     'args': '(8,)', 
     'kwargs': '{}'}]}] 

..ようにreservedタスク、activeタスクとを検査するためにあなたを助けることができます。詳細は

:(私は悪いアイデアだと思います)http://docs.celeryproject.org/en/latest/userguide/workers.html#dump-of-reserved-tasks

2番目のオプションは直接backendをチェックするようになります。このRedisのが唯一のセロリのバックエンドとして使用し、あなただけのこのタスクを実行している場合 - あなたができますすべてのキーを見つけて(uuidはキーの一部です)、タスクのステータスは値の一部になります。

関連する問題