成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

基于websocket的celery任務(wù)狀態(tài)監(jiān)控

microelec / 3371人閱讀

摘要:目的曾經(jīng)想向前臺(tái)實(shí)時(shí)返回任務(wù)的狀態(tài)監(jiān)控,也查看了很多博客,但是好多也沒能如愿,因此基于網(wǎng)上已有的博客已經(jīng)自己的嘗試,寫了一個(gè)小的,實(shí)現(xiàn)前臺(tái)實(shí)時(shí)獲取后臺(tái)傳輸?shù)娜蝿?wù)狀態(tài)。實(shí)現(xiàn)仿照其他例子實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的后臺(tái)任務(wù)監(jiān)控。

1. 目的
曾經(jīng)想向前臺(tái)實(shí)時(shí)返回Celery任務(wù)的狀態(tài)監(jiān)控,也查看了很多博客,但是好多也沒能如愿,因此基于網(wǎng)上已有的博客已經(jīng)自己的嘗試,寫了一個(gè)小的demo,實(shí)現(xiàn)前臺(tái)實(shí)時(shí)獲取后臺(tái)傳輸?shù)娜蝿?wù)狀態(tài)。

2. 準(zhǔn)備
本篇文章使用的是Flask框架,安裝celery,celery采用redis作為存儲(chǔ)。同時(shí)用到了Flask-SocketIO建立websocket。同時(shí)還用到了協(xié)程庫(kù)eventlet(這個(gè)是Flask-SocketIO文檔建議的,鏈接文檔)。

3. 實(shí)現(xiàn)
demo仿照其他例子實(shí)現(xiàn)了一個(gè)簡(jiǎn)單的后臺(tái)任務(wù)監(jiān)控。我們直接上代碼吧,下面是server端代碼:

# -*- utf-8 -*-
# app.py
import time
import uuid
from flask import Flask, render_template, request, make_response, jsonify
from flask_socketio import SocketIO
from celery import Celery
import eventlet
from flask_redis import FlaskRedis
eventlet.monkey_patch()

app = Flask(__name__)

app.config["BROKER_URL"] = "redis://localhost:6379/0"
app.config["CELERY_RESULT_BACKEND"] = "redis://localhost:6379/0"
app.config["CELERY_ACCEPT_CONTENT"] = ["json", "pickle"]
app.config["REDIS_URL"] = "redis://localhost:6379/0"

socketio = SocketIO(app, async_mode="eventlet",message_queue=app.config["CELERY_RESULT_BACKEND"])
redis = FlaskRedis(app)

celery = Celery(app.name)
celery.conf.update(app.config)

#模擬后臺(tái)耗時(shí)任務(wù)
@celery.task
def background_task(uid):
    sid = redis.get(uid)
    socketio.emit("info", {"data": "Task starting ...", "time": time.time() * 1000 },room=sid, namespace="/task")
    socketio.sleep(4)
    socketio.emit("info", {"data": "Task running!", "time": time.time() * 1000 }, room=sid, namespace="/task")
    socketio.sleep(5)
    socketio.emit("info", {"data": "Task complete!", "time": time.time()*1000 }, room=sid, namespace="/task")

#建立鏈接時(shí)把sid傳到瀏覽器端保存。
@socketio.on("connect", namespace="/task")
def connect_host():
    sid = request.sid
    socketio.emit("hostadd", {"sid": sid}, room=sid, namespace="/task")

#將每一個(gè)客戶端生成一個(gè)uuid存放在cookie中
@app.route("/")
def index():
    if not request.cookies.get("host_uid", None):
        uid = uuid.uuid1().get_hex()
        response = make_response(render_template("index.html"))
        response.set_cookie("host_uid", uid)
        return response
    return render_template("index.html")

@app.route("/task")
def start_background_task():
    uid = request.cookies.get("host_uid")
    background_task.delay(uid)
    return "Started"

#設(shè)置sid建立鏈接后瀏覽器將sid傳送到server,并將uid與sid映射存放在redis里面,默認(rèn)保留12小時(shí)
@app.route("/setsid", methods=["POST"])
def set_uid():
    data = request.json
    uid = request.cookies.get("host_uid")
    redis.set(uid, data["sid"])
    redis.expire(uid, 3600 * 12)
    return jsonify({"success": True})

if __name__ == "__main__":
    socketio.run(app, host="0.0.0.0", port=5000, debug=True)

如果不想使用debug模式的話,可以用gunicorn運(yùn)行,命令如下所示:

gunicorn --worker-class eventlet -w 1 app:app

使用上述命令需要注意,由于gunicorn負(fù)載均衡算法的限制,文檔建議worker數(shù)量為1,我測(cè)試過大于1,確實(shí)會(huì)出問題。
前端代碼如下,index.html:




    test
    
    


    

Logging

GitHub地址:https://github.com/junfenggoo...

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/42274.html

相關(guān)文章

  • 分布式任務(wù)框架之celery

    摘要:架構(gòu)消息代理,作為臨時(shí)儲(chǔ)存任務(wù)的中間媒介,為提供了隊(duì)列服務(wù)。生產(chǎn)者將任務(wù)發(fā)送到,消費(fèi)者再?gòu)墨@取任務(wù)。如果使用,則有可能發(fā)生突然斷電之類的問題造成突然終止后的數(shù)據(jù)丟失等后果。任務(wù)調(diào)度器,負(fù)責(zé)調(diào)度并觸發(fā)定時(shí)周期任務(wù)。 架構(gòu) showImg(https://segmentfault.com/img/bVbmDXa?w=831&h=413); Broker 消息代理,作為臨時(shí)儲(chǔ)存任務(wù)的中間媒...

    fredshare 評(píng)論0 收藏0
  • 如何在多個(gè)queue多臺(tái)server上部署Celery 以及任務(wù)狀態(tài)監(jiān)控flower

    摘要:是分布式任務(wù)隊(duì)列,能實(shí)時(shí)處理任務(wù),同時(shí)支持官方文檔工作原理如下發(fā)送給從中消費(fèi)消息,并將結(jié)果存儲(chǔ)在中本文中使用的是,使用的是現(xiàn)在有兩個(gè),分別是加法運(yùn)算和乘法運(yùn)算。假定乘法運(yùn)算的事件優(yōu)先級(jí)高事件也很多,對(duì)于加法運(yùn)算,要求每分鐘最多處理個(gè)事件。 Celery是分布式任務(wù)隊(duì)列,能實(shí)時(shí)處理任務(wù), 同時(shí)支持task scheduling. 官方文檔Celery工作原理如下: celery cli...

    goji 評(píng)論0 收藏0
  • Flask+Celery+Redis實(shí)現(xiàn)隊(duì)列化異步任務(wù)

    摘要:使用異步框架,例如等等,裝飾異步任務(wù)。它是一個(gè)專注于實(shí)時(shí)處理的任務(wù)隊(duì)列,同時(shí)也支持任務(wù)調(diào)度。不存儲(chǔ)任務(wù)狀態(tài)。標(biāo)識(shí)要使用的默認(rèn)序列化方法的字符串。指定該任務(wù)的結(jié)果存儲(chǔ)后端用于此任務(wù)。 概述: ????????我們考慮一個(gè)場(chǎng)景,公司有一個(gè)需求,現(xiàn)在需要做一套web系統(tǒng),而這套系統(tǒng)某些功能需要使用...

    Ali_ 評(píng)論0 收藏0
  • 基于Flask-Angular項(xiàng)目組網(wǎng)架構(gòu)與部署

    摘要:基于網(wǎng),分享項(xiàng)目的組網(wǎng)架構(gòu)和部署。項(xiàng)目組網(wǎng)架構(gòu)架構(gòu)說明流項(xiàng)目訪問分為兩個(gè)流,通過分兩個(gè)端口暴露給外部使用數(shù)據(jù)流用戶訪問網(wǎng)站。通過進(jìn)行配置,使用作為異步隊(duì)列來存儲(chǔ)任務(wù),并將處理結(jié)果存儲(chǔ)在中。 基于Raindrop網(wǎng),分享項(xiàng)目的組網(wǎng)架構(gòu)和部署。 項(xiàng)目組網(wǎng)架構(gòu) showImg(https://cloud.githubusercontent.com/assets/7239657/1015704...

    kelvinlee 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<