摘要:目的曾經(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
摘要:架構(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ù)的中間媒...
摘要:是分布式任務(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...
摘要:使用異步框架,例如等等,裝飾異步任務(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)某些功能需要使用...
摘要:基于網(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...
閱讀 1230·2021-09-27 13:34
閱讀 1019·2021-09-13 10:25
閱讀 541·2019-08-30 15:52
閱讀 3479·2019-08-30 13:48
閱讀 675·2019-08-30 11:07
閱讀 2198·2019-08-29 16:23
閱讀 2027·2019-08-29 13:51
閱讀 2357·2019-08-26 17:42