ajax并发请求阻塞介绍(ajax轮询请求现实)
admin
2022-11-09 03:10:21

轮询和长轮询优缺点分析

轮询:软件定时向服务器发送Ajax请求,服务器接到请求后马上返回响应消息并关闭连接。优点:后端程序编写对比简无脑单。缺点:请求中有大半是无用,浪费带宽和服务器资源。实例:适于小型应用。

长轮询:软件向服务器发送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,jsonify

app = 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

Title

    {% for key,val in users.items() %}

  • {{val.name}} ({{val.count}})
  • {% endfor %}

长轮询示例代码

Flask版

app.py

from flask import Flask,render_template,request,jsonify,session

import uuid

import queue

app = 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

Title

    {% for key,val in users.items() %}

  • {{val.name}} ({{val.count}})
  • {% endfor %}

相关内容

热门资讯

世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
春风一拂千山绿 春风轻拂千山绿... 新春对联欣赏1、天意无常顺子自然,万般皆苦唯有自渡。2、门迎百福吉星照,户纳千祥鸿运开。3、一门天赐...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...