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 pywsgifrom geventwebsocket.handler import WebSocketHandlerserver = 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 pywsgifrom geventwebsocket.handler import WebSocketHandlerfrom gevent import monkeymonkey.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

python模块:Sockets阻塞和非阻塞测试相关推荐

  1. python gevent模块 下载_Python协程阻塞IO非阻塞IO同步IO异步IO

    Python-协程-阻塞IO-非阻塞IO-同步IO-异步IO 一.协程 协程又称为微线程 CPU 是无法识别协程的,只能识别是线程,协程是由开发人员自己控制的.协程可以在单线程下实现并发的效果(实际计 ...

  2. 在Python中对子进程进行非阻塞读取

    我正在使用子流程模块来启动子流程并连接到其输出流(stdout). 我希望能够在其stdout上执行非阻塞读取. 有没有一种方法可以使.readline成为非阻塞状态,或者在调用.readline之前 ...

  3. python网络编程基础(线程与进程、并行与并发、同步与异步、阻塞与非阻塞、CPU密集型与IO密集型)...

    python网络编程基础(线程与进程.并行与并发.同步与异步.阻塞与非阻塞.CPU密集型与IO密集型) 目录 线程与进程并行与并发同步与异步阻塞与非阻塞CPU密集型与IO密集型 线程与进程 进程 前言 ...

  4. python epoll 并发_Python语言之python并发原理(阻塞、非阻塞、epoll)

    本文主要向大家介绍了Python语言之python并发原理(阻塞.非阻塞.epoll),通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. 在Linux系统中 01 阻塞服务端 特征: ...

  5. python并发处理同一个文件_python并发编程(并发与并行,同步和异步,阻塞与非阻塞)...

    最近在学python的网络编程,学会了socket通信,并利用socket实现了一个具有用户验证功能,可以上传下载文件.可以实现命令行功能,创建和删除文件夹,可以实现的断点续传等功能的FTP服务器.但 ...

  6. python 进程池阻塞和非阻塞_python 之 并发编程(进程池与线程池、同步异步阻塞非阻塞、线程queue)...

    9.11 进程池与线程池 池子使用来限制并发的任务数目,限制我们的计算机在一个自己可承受的范围内去并发地执行任务 池子内什么时候装进程:并发的任务属于计算密集型池子内什么时候装线程:并发的任务属于IO ...

  7. python阻塞和非阻塞_Python基础必备知识:同步异步阻塞非阻塞

    一.状态介绍 在了解其他概念之前,我们首先要了解进程的几个状态.在程序运行的过程中,由于被操作系统的调度算法控制,程序会进入几个状态:就绪,运行和阻塞. 就绪(Ready)状态:当进程已分配到除CPU ...

  8. python复制文件夹不阻塞_python学习笔记-(十四)I/O多路复用 阻塞、非阻塞、同步、异步...

    1. 概念说明 1.1 用户空间与内核空间 现在操作系统都是采用虚拟存储器,那么对32位操作系统而言,它的寻址空间(虚拟存储空间)为4G(2的32次方).操作系统的核心是内核,独立于普通的应用程序,可 ...

  9. IO:同步,异步,阻塞,非阻塞

    IO - 同步,异步,阻塞,非阻塞 都是老生常谈的东西,多通读几遍,理解透彻! 实际上同步与异步是针对应用程序与内核的交互而言的.同步过程中进程触发IO操作并等待(也就是我们说的阻塞)或者轮询的去查看 ...

  10. Socket阻塞与非阻塞,同步与异步、I/O模型

    [原文链接] 1. 概念理解 在进行网络编程时,我们常常见到同步(Sync)/异步(Async),阻塞(Block)/非阻塞(Unblock)四种调用方式: 同步:       所谓同步,就是在发出一 ...

最新文章

  1. python下载指定的版本包
  2. oracle clob 存储大于4000字符的字符串
  3. C++11 Lambda
  4. C语言求二个数的最大公约数gcd和最小公倍数lcm(附完整源码)
  5. ThinikPHP 前端URL模式
  6. 03.elasticsearch_index操作
  7. 【Oracle Database】数据库控制文件管理
  8. 【面试总结】java测试工程师培训
  9. [数学][欧拉降幂定理]Exponial
  10. css学习笔记(一)
  11. 基于Python的情感分析案例——知网情感词典
  12. python+selenium小米商城红米K40手机抢购!
  13. 同济大学高等数学第7版视频
  14. App Store审核规范
  15. windows下解压tar.gz文件
  16. 京瓷p5018cdn教程_京瓷ECOSYS P5018cdn驱动
  17. 基于jsp毕业设计题目50例
  18. 我的世界(18)-精英怪物(InfernalMobs插件)
  19. 互联网裁员下的人生百态,你了解多少
  20. ftp文件传输工具,5款你会喜欢的ftp文件传输工具

热门文章

  1. 应用计算机测定线性电阻伏安特性实验结论,电路分析实验报告(电阻元件伏安特性的测量)...
  2. c++实现简易trpg角色生成器
  3. Android客户端和Java服务器端集成支付宝
  4. HCL华三模拟器静态路由实验
  5. C语言从入门到入土(三)
  6. jadx在windows下的安装
  7. 使用Java处理键盘输入(DTMF)
  8. canvas教程大纲
  9. 高仿知乎Android客户端欢迎引导动画
  10. 升级安装win11 22H2(跳过TPM和CPU等检测)