libuv 高并发异步使用

91人阅读 评论(0) 收藏 举报
分类:

问题来源:
在开发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

查看评论

lua + libuv 的坑与爽

libuv 是大名鼎鼎的 nodejs 的底层库。用 C 实现,代码量不大,但是五脏俱全。比起同类项目 libevent 我更喜欢它简洁的 API 接口。比 libevent 少了 httpserve...
  • liuyingming910
  • liuyingming910
  • 2015-01-05 18:54:25
  • 832

tinyweb: C语言 + libuv 开发的最精简的WebServer (附源码)

libuv 是一个高性能事件驱动网络库,是 Node.js 的底层实现。经过我(Liigo)在实际项目中的深度应用,发现 libuv 在代码质量、运行效率、网络吞吐量、稳定性、跨平台等多方面都相当优...
  • liigo
  • liigo
  • 2013-06-22 09:44:52
  • 17139

libuv之helloworld

让我们开始写第一个libuv程序吧!它什么都没做,只是开启了一个loop,然后很快地退出了。 #include #include #include   //这是libuv非常重要的一个头文...
  • js_gary
  • js_gary
  • 2017-05-16 17:06:21
  • 471

Golang编程经验总结

如何选择web框架: 首先Golang语言开发web项目不一定非要框架,本身已经提供了Web开发需要的一切必要技术。当然如果想要ruby里面Rail那种高层次全栈式的MVC框架, Golang里面暂...
  • u013834131
  • u013834131
  • 2015-02-03 16:38:05
  • 7736

libuv之介绍

本人是在研究linux下socket TCP/IP通讯时,用到了一些linux下的API,比如socket, connect, bind,listen, accept等等,简单写个点对点的通讯,直接用...
  • js_gary
  • js_gary
  • 2017-05-16 15:56:14
  • 538

基于libuv的最精简Web服务器:tinyweb v1 v2 v3 (C语言源码)

一年之前,我发表过一篇博客《》
  • liigo
  • liigo
  • 2014-08-07 21:07:27
  • 9190

libuv与libev的对比

libuv 和 libev ,两个名字相当相近的 I/O Library ,最近有幸用两个 Library 都写了一些东西,下面就来说一说我本人对两者共同与不同点的主观表述。 高性能网络编程这个...
  • monokeroslun
  • monokeroslun
  • 2014-07-03 16:35:04
  • 427

visual sudio2015下编译libuv1.1x

1.准备编译vs的环境 1.libuv源码 2.Git软件,用来下载gyp文件 3.python用来生成VS项目,对版本有要求,一般是2.6/2.7 (python-2.7.11.msi) 2...
  • js_gary
  • js_gary
  • 2017-05-21 10:58:30
  • 617

移植 libuv 到 Visual C++ 6.0 并支持在 Windows XP 系统下编译

我从一年前(大概2013年6,7月份)开始在业余时间做这项移植工作,走走停停,陆续用了一两个月的时间,才基本完成。这期间做了详细的移植记录,现在发布出来,希望对某些人有用。就在昨天(2014年7月12...
  • liigo
  • liigo
  • 2014-07-13 14:39:26
  • 5862
    个人资料
    持之以恒
    等级:
    访问量: 2万+
    积分: 666
    排名: 7万+