python模块:Sockets阻塞和非阻塞测试

1 阻塞

1.0 服务端

from flask import Flask, jsonify, request, Blueprint
from flask_sockets import Sockets
import datetime
import time
import random
from queue import Queue 


app = Flask(__name__)
sockets = Sockets(app)
datas_queue = Queue(maxsize=50)
datas_queue.put(250)

@sockets.route('/echo')
def echo_socket(ws):
    output_datas = []
    while not ws.closed:
        if datas_queue.empty() or datas_queue.qsize() < 10:
            now = datetime.datetime.now().isoformat() + 'Z'
            ws.send(now)  #发送数据
            time.sleep(1)
            # datas_queue.put("正在更新数据")
            # ws.send(datas_queue.get())
        else:
            if not datas_queue.empty():
                output_datas.append(datas_queue.get()) 
            ws.send(output_datas)
            time.sleep(2)
        # now = datetime.datetime.now().isoformat() + 'Z'
        # ws.send(now)  #发送数据
        # time.sleep(1)


datas = Blueprint("data", __name__, url_prefix="/api")
# app.register_blueprint(datas)
@datas.route("/connect", methods=["GET", "POST"])
def connect():
    return jsonify({"infos":"connecting succeessfully"})

@datas.route('/data/put-queue', methods=["GET", "POST"])
def put_queue():
    put_datas = request.json["put_datas"]
    datas_queue.put(put_datas)
    datas_number = datas_queue.qsize()
    return jsonify({"input_datas":put_datas, "datas_number":datas_number})

@datas.route("/data/get-queue", methods=["GET", "POST"])
def get_queue():
    # get_datas = request.json["get_datas"]
    if datas_queue.empty():
        datas_queue.put("队列数消费完,请重新添加数据")
        output_datas = datas_queue.get()
        return jsonify({"output_datas":output_datas})
    else:
        output_datas = datas_queue.get()
        datas_left_number = datas_queue.qsize()
        return jsonify({"output_datas":output_datas, "datas_left_nubmer":datas_left_number})


if __name__ == "__main__":
    app.register_blueprint(datas)
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    server = pywsgi.WSGIServer(('0.0.0.0', 8090), app, handler_class=WebSocketHandler)
    print('server start')
    server.serve_forever()

1.2 前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script>
</head>
<body>
    <div id="time" style="width: 300px;height: 50px;background-color: #0C0C0C;
    color: white;text-align: center;line-height: 50px;margin-left: 40%;font-size: 20px"></div>
    <script>
            var ws = new WebSocket("ws://127.0.0.1:8090/echo");  
            ws.onmessage = function (event) {
                content = document.createTextNode(event.data); 
                $("#time").html(content);
            };
    </script>
    </body>
</html>

1.3 小析

当队列中的数据全部消费之后,进入阻塞状态,http的接口不能请求,被阻塞了.

2 非阻塞

2.1 服务端

from flask import Flask, jsonify, request, Blueprint
from flask_sockets import Sockets
import datetime
import time
import random
from queue import Queue 

app = Flask(__name__)
sockets = Sockets(app)
datas_queue = Queue(maxsize=50)
datas_queue.put(250)

@sockets.route('/echo')
def echo_socket(ws):
    output_datas = []
    while not ws.closed:
        if datas_queue.empty() or datas_queue.qsize() < 10:
            now = datetime.datetime.now().isoformat() + 'Z'
            ws.send(now)  #发送数据
            time.sleep(1)
            # datas_queue.put("正在更新数据")
            # ws.send(datas_queue.get())
        else:
            if not datas_queue.empty():
                output_datas.append(datas_queue.get()) 
            ws.send(output_datas)
            time.sleep(2)

datas = Blueprint("data", __name__, url_prefix="/api")
# app.register_blueprint(datas)
@datas.route("/connect", methods=["GET", "POST"])
def connect():
    return jsonify({"infos":"connecting succeessfully"})

@datas.route('/data/put-queue', methods=["GET", "POST"])
def put_queue():
    put_datas = request.json["put_datas"]
    datas_queue.put(put_datas)
    datas_number = datas_queue.qsize()
    return jsonify({"input_datas":put_datas, "datas_number":datas_number})

@datas.route("/data/get-queue", methods=["GET", "POST"])
def get_queue():
    # get_datas = request.json["get_datas"]
    if datas_queue.empty():
        datas_queue.put("队列数消费完,请重新添加数据")
        output_datas = datas_queue.get()
        return jsonify({"output_datas":output_datas})
    else:
        output_datas = datas_queue.get()
        datas_left_number = datas_queue.qsize()
        return jsonify({"output_datas":output_datas, "datas_left_nubmer":datas_left_number})

if __name__ == "__main__":
    app.register_blueprint(datas)
    from gevent import pywsgi
    from geventwebsocket.handler import WebSocketHandler
    from gevent import monkey
    monkey.patch_all()
    server = pywsgi.WSGIServer(('0.0.0.0', 8090), app, handler_class=WebSocketHandler)
    print('server start')
    server.serve_forever()

2.2 前端

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.0/jquery.js"></script>
</head>
<body>
    <div id="time" style="width: 300px;height: 50px;background-color: #0C0C0C;
    color: white;text-align: center;line-height: 50px;margin-left: 40%;font-size: 20px"></div>
    <script>
            var ws = new WebSocket("ws://127.0.0.1:8090/echo");  
            ws.onmessage = function (event) {
                content = document.createTextNode(event.data); 
                $("#time").html(content);
            };
    </script>
    </body>
</html>

2.3 小析

当队列中的数据全部消费之后,进入非阻塞状态,http的接口仍可请求,添加队列数据.

3 小结

(1) gevent天生阻塞,Flask天生不带阻塞;
(2) gevent阻塞,解决方案:添加monkey;


【参考文献】
[1]https://blog.csdn.net/Xin_101/article/details/86663627

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

天然玩家

坚持才能做到极致

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值