libuv 高并发异步使用

2023-11-04

问题来源:
在开发libuv客户端-服务器时,需要并发的向客户端发送数据,libuv就会用到 uv_write函数,因此,我的初步方案是:
1. 创建线程池;
2. 线程池分配数据内存buf,并打包;
3. 将包发给 uv_write;
4. uv_write_cb 中释放buf;
通过开辟30个线程,发现客户端能正确接收数据,但是无法调用uv_write_cb ,导致内存增加,通过查官方文档:
The async thread communication works on loops so although any thread can be the message sender, only threads with libuv loops can be receivers (or rather the loop is the receiver). libuv will invoke the callback (print_progress) with the async watcher whenever it receives a message.
大概的意思是,只有经过loop的ibuv内部的函数才能调用回调函数,可以采用的方案是,将数据发送在uv_queue_work中调用,经过测试,uv_write_cb可以正确响应。
线程池采用的方案是:
1.创建自己线程池 self_pool;
2. 组数据包buf1, 并将buf1发送给uv_queue_work;
3. uv_queue_work 的uv_work函数解析buf1并将数据发送给uv_write;
经过测试 发现如果self_pool有1个以上线程, 函数会崩溃,就是说并发处理uv_queue_work,导致程序问题,加锁也无效。
改进方案:
1.创建自己线程池 self_pool;
2. 创建单线程thread;
3. self_pool组数据包buf1 并将数据加入queue中
4. thread获取buf,创建req对象并将数据发送给uv_queue_work
5.uv_queue_work 的uv_work函数解析buf1并将数据发送给uv_write;
经过测试,以上方案没有问题
继续查阅文档,发现uv_async_send也可以作为其它外界线程调用接口,但是uv_async_t.data并不是线程安全的,同时uv_async_t如果并发处理,在uv_async_send的回调函数没有响应前,多路调用可能会并入一路,也就是说N个调用可能会只有一个回调函数响应。
处理方案1
1. 创建uv_async_t对象async,并加入set中;
2. uv_async_init并调用uv_async_send;
3. 在回调函数中 uv_close((uv_handle_t*) &async, NULL);如果不作处理,将会一直阻塞
4. 从set删除记录。
方案2
1.创建两个队列queue1作为空闲队列, queue2作为忙队列;
2.创建N个uv_async_t放入queue1中;
3.当需要发送数据时,从queue 中取空闲uv_async_t异步发送
4.在回调函数中,将uv_async_t放入queue2中

参考:
libuv的多线程之间传递消息 :https://www.cnblogs.com/guoxiaoqian/p/3945242.html
libuv之async使用
https://blog.csdn.net/limite_god/article/details/43700325
基于libuv的TCP设计
http://www.cnblogs.com/wqvbjhc/p/3758141.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

libuv 高并发异步使用 的相关文章

随机推荐

  • python3.7 安装Airflow中HiveToMySqlTransfer报错解决

    报错内容如下 File app python lib python3 7 site packages airflow hooks hive hooks py line 783 in get conn from pyhive hive imp
  • 百度地图BMap

    做了半天 搜到一个很好的demo 能解决多点的问题 http blog csdn net a497785609 article details 24009031 div style width 100 height 500px border
  • [大话设计模式C++版] 第9章 简历复印 —— 原型模式

    源码可以在这里找到 大话设计模式C 版 简历代码初步实现 写一个简历类 必须要有姓名 可以设置性别和年龄 可以设置工作经历 客户端实例化三份简历 main cpp include
  • docker运行报错:docker: Error response from daemon: No command specified.

    mysql镜像运行报错 docker Error response from daemon No command specified 如图 解决方案 是由于命令没启用的缘故 所以需要在运行命令后面追加 bin bash 如下图 问题解决 希
  • IDEA中找不到符号问题解决

    把以上三处的jdk从8改成11 再也不想看到这个问题了
  • 开启WSL之旅

    专业点的计算机使用者 会经常跟Linux与windows系统打交道 经常是一台计算机装双系统或者在一个系统中安装虚拟机 双系统来回切换 挺麻烦 遇到同时需要两个环境时 就没办法了 虚拟机 对于配置高的机器还可以 不过性能体验也不太好 总之是
  • “烧钱”的大模型:初探成本拆解与推理优化方法

    编者按 大模型的成本问题一直以来是大家重点关注的问题 本文重点讨论了训练大型语言模型 LLMs 需要的成本 并简要介绍什么是LLM以及一些用于优化大模型推理表现的技术 虽然很难准确预测LLMs未来会怎么发展 但可以肯定 如果成本问题得到解决
  • 服务器系统文件共享如何设置,服务器操作系统文件共享设置

    服务器操作系统文件共享设置 内容精选 换一换 切换操作系统是为您的云服务器重新切换一个系统盘 切换完成后云服务器的系统盘ID会发生改变 并删除原有系统盘 如果云服务器当前使用的操作系统不能满足业务需求 如软件要求的操作系统版本较高 您可以选
  • 思科设备命令讲解(超基础)

    作者 小刘在C站 个人主页 小刘主页 每天分享云计算网络运维课堂笔记 努力不一定有回报 但一定会有收获加油 一起努力 共赴美好人生 夕阳下 是最美的绽放 树高千尺 落叶归根人生不易 人间真情 目录 一 静态路由配置命令 二 默认路由配置命令
  • 2023年前端面试题总结

    某多多 1 Promise实现原理 2 vue组件间通信 3 性能优化 4 vuex数据流动过程 5 谈谈css预处理器机制 6 算法 Promise串行 某眼电影 1 vue组件间通信 2 react和vue更新机制的区别 3 Vue3
  • 超硬货,大型 Rust 项目经验分享

    本篇文章中 我将分享我组织大型 Rust 项目的经验 但这绝不是权威的 只是我通过尝试和错误中发现的一些小技巧 Cargo 作为 Rust 的构建系统 遵循约定大于配置的原则 它不仅为小型项目提供了一套良好的默认配置集 尤其为公共 crat
  • Flash学习笔记

    快捷键 1 F8 可以将散件转化为元件 2 Ctrl 2 满画布显示 3 F6 插入关键帧 4 Ctrl Enter 预览 一 第一章 1 颜料桶 更改填充色 墨水瓶 改变边框色 2 动画的分类 位移动画 形变动画 逐帧动画 路径动画 蒙版
  • Windows server 2012_R2 无法安装VMware Tools解决方法(详细)

    百度网盘 链接 https pan baidu com s 1QbIHSv1Df8eVAIH2ym1g8Q pwd rdi4 提取码 rdi4 官网下载链接 KB2919442https www microsoft com zh cn do
  • Table固定表头固定左侧列

    效果图 思路 把需要固定的内容进行拆封 比如左侧的表头和内容 右侧的表头和内容 都单独的存放在一个table中 在滚动条滚动的时候通过jquery scroll 区分横向纵向滚动条的方法来实现左侧内容的滚动和右侧表头的滚动 第一步 div
  • 直接线性变换解法(DLT)用于标定相机

    直接线性变换法是建立像点坐标和相应物点物方空间坐标之间直接的线性关系的算法 特点 不需要内外方位元素 适合于非量测相机 满足中 低精度的测量任务 可以标定单个相机 1 各坐标系之间的关系推导直接线性变换解法 1 1 像素坐标系与像平面坐标系
  • MATLAB中用Application Complier生成可执行文件的步骤及相关注意事项

    生成可独立执行的软件 可以分成以下5个主要的步骤 1 打开Application Complier 2 添加主程序文件 3 可执行文件设置 4 选择打包方式 5 相关文件解释 大体步骤多类似 里面有些容易出错的小细节 相关设置需要注意的有
  • node中使用express+mongodb实现分页查询

    文章目录 引言 一 分页案例 二 查询方法扩展介绍 1 find 2 limit 3 skip 4 populate 总结 引言 在Web应用程序开发中 分页查询是必不可少的功能之一 Node js提供了许多优秀的工具和框架来实现分页查询
  • 马虎的算式

    import java util public class Main public static void main String args int ans 0 for int a 1 a lt 10 a for int b 1 b lt
  • Struts2输入校验(XML方式)

    本章主要介绍struts2的XML配置方式输入校验 以下将结合一个实例程序进行说明 代码结构 关键代码 RegistAction javapackage com alfred regist action import java util D
  • libuv 高并发异步使用

    问题来源 在开发libuv客户端 服务器时 需要并发的向客户端发送数据 libuv就会用到 uv write函数 因此 我的初步方案是 1 创建线程池 2 线程池分配数据内存buf 并打包 3 将包发给 uv write 4 uv writ