小樱知识 > 生活常识ajax轮询请求现实(ajax并发请求阻塞讲解)

ajax轮询请求现实(ajax并发请求阻塞讲解)

提问时间:2022-03-16 12:27:51来源:小樱知识网


轮询和长轮询优缺点分析

  1. 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。优点:后端程序编写比较容易。缺点:请求中有大半是无用,浪费带宽和服务器资源。实例:适于小型应用。
  2. 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。优点:在无消息的情况下不会频繁的请求。缺点:服务器hold连接会消耗资源。实例:WebQQ、Hi网页版、Facebook IM。

另外,对于长连接和socket连接也有区分:

  • 长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
  • 优点:消息即时到达,不发无用请求。
  • 缺点:服务器维护一个长连接会增加开销。
  • 实例:Gmail聊天
  • Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
  • 优点:实现真正的即时通信,而不是伪即时。
  • 缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
  • 实例:网络互动游戏

轮询示例代码

Flask版

app.py

app.pyfrom flask import Flask,render_template,request,jsonifyapp = Flask(__name__)USERS = {    '1':{'name':'路人甲','count':1},    '2':{'name':'路人乙','count':0},    '3':{'name':'路人丙','count':0},}@app.route('/user/list')def user_list():    import time    return render_template('user_list.html',users=USERS)@app.route('/vote',methods=['POST'])def vote():    uid = request.form.get('uid')    USERS[uid]['count'] += 1    return "投票成功"@app.route('/get/vote',methods=['GET'])def get_vote():    return jsonify(USERS)if __name__ == '__main__':    # app.run(host='127.0.0.1',threaded=True)    app.run(threaded=True)

templates/user_list.html

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <title>Title</title>    <meta name="viewport" content="width=device-width, initial-scale=1">    <style>        li{            cursor: pointer;        }    </style></head><body>    <ul id="userList">        {% for key,val in users.items() %}            <li uid="{{key}}">{{val.name}} ({{val.count}})</li>        {% endfor %}    </ul>    <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script>    <script>        $(function () {            $('#userList').on('dblclick','li',function () {                var uid = $(this).attr('uid');                $.ajax({                    url:'/vote',                    type:'POST',                    data:{uid:uid},                    success:function (arg) {                        console.log(arg);                    }                })            });        });        /*        获取投票信息         */        function get_vote() {            $.ajax({                url:'/get/vote',                type:"GET",                dataType:'JSON',                success:function (arg) {                    $('#userList').empty();                    $.each(arg,function (k,v) {                        var li = document.createElement('li');                        li.setAttribute('uid',k);                        li.innerText = v.name + "(" + v.count + ')' ;                        $('#userList').append(li);                    })                }            })        }        /* 定时任务 */        setInterval(get_vote,3000);    </script></body></html>

长轮询示例代码

Flask版

app.py

from flask import Flask,render_template,request,jsonify,sessionimport uuidimport queueapp = Flask(__name__)app.secret_key = 'asdfasdfasd'USERS = {    '1':{'name':'路人甲','count':1},    '2':{'name':'路人乙','count':0},    '3':{'name':'路人丙','count':0},}QUEQUE_DICT = {    # 'asdfasdfasdfasdf':Queue()}@app.route('/user/list')def user_list():    user_uuid = str(uuid.uuid4())    QUEQUE_DICT[user_uuid] = queue.Queue()    session['current_user_uuid'] = user_uuid    return render_template('user_list.html',users=USERS)@app.route('/vote',methods=['POST'])def vote():    uid = request.form.get('uid')    USERS[uid]['count'] += 1    for q in QUEQUE_DICT.values():        q.put(USERS)    return "投票成功"@app.route('/get/vote',methods=['GET'])def get_vote():    user_uuid = session['current_user_uuid']    q = QUEQUE_DICT[user_uuid]    ret = {'status':True,'data':None}    try:        users = q.get(timeout=5)        ret['data'] = users    except queue.Empty:        ret['status'] = False    return jsonify(ret)if __name__ == '__main__':    app.run(host='127.0.0.1',threaded=True)    # app.run(threaded=True)

\templates\user_list.html

<!DOCTYPE html><html lang="zh-CN"><head>    <meta charset="UTF-8">    <title>Title</title>    <meta name="viewport" content="width=device-width, initial-scale=1">    <style>        li{            cursor: pointer;        }    </style></head><body>    <ul id="userList">        {% for key,val in users.items() %}            <li uid="{{key}}">{{val.name}} ({{val.count}})</li>        {% endfor %}    </ul>    <script src="https://cdn.bootcss.com/jquery/3.3.0/jquery.min.js"></script>    <script>        $(function () {            $('#userList').on('click','li',function () {                var uid = $(this).attr('uid');                $.ajax({                    url:'/vote',                    type:'POST',                    data:{uid:uid},                    success:function (arg) {                        console.log(arg);                    }                })            });            get_vote();        });        /*        获取投票信息         */        function get_vote() {            $.ajax({                url:'/get/vote',                type:"GET",                dataType:'JSON',                success:function (arg) {                    if(arg.status){                        $('#userList').empty();                            $.each(arg.data,function (k,v) {                                var li = document.createElement('li');                                li.setAttribute('uid',k);                                li.innerText = v.name + "(" + v.count + ')' ;                                $('#userList').append(li);                            })                    }                    get_vote();                }            })        }    </script></body></html>

以上内容就是为大家推荐的ajax轮询请求现实(ajax并发请求阻塞讲解)最佳回答,如果还想搜索其他问题,请收藏本网站或点击搜索更多问题

内容来源于网络仅供参考
二维码

扫一扫关注我们

版权声明:所有来源标注为小樱知识网www.xiaoyin02.com的内容版权均为本站所有,若您需要引用、转载,只需要注明来源及原文链接即可。

本文标题:ajax轮询请求现实(ajax并发请求阻塞讲解)

本文地址:https://www.xiaoyin02.com/shcs/117005.html

相关文章