Libuv多路事件循环(Multiple event loops)

转载 2016年08月31日 16:38:47

Libuv多路事件循环(Multiple event loops)

文章目录

你也可以在同一个线程中使用多路事件循环, 但意义并不大, 因为调用其中某一个事件循环的 uv_run 会使得程序阻塞, 其他事件循环不能同时运行. 不过也可以小心地通过多次调用 uv_run_once() 来完成一些有趣的工作.

多路事件循环的形式(Modality)

你可以在你的程序中按照相对标准方式使用多路事件循环, 即第二个事件循环先暂停第一个事件循环, 直到发生了动作(用户按下了 Return(Enter) 键, 或者发生了新的事件等).

各线程拥有自己的事件循环(One loop per thread)

One loop per thread 才是多路事件循环的’标准模型’, 它和我们在 进程 一章中介绍的产生多个进程方式并无太大区别.

使用两个事件循环来同步(sing two loops for synchronization)

也有一些比较特殊的应用场景需要两个事件循环来进行同步(而不是使用条件变量), 在 node-taglib 库中我就使用了这种同步机制. 具体的应用场景如下:

  1. 主线程 main thread 通过 uv_queue_work 在工作线程中调用一个阻塞函数.
  2. 工作线程 worker thread 调用一个自定义函数, 并且自定义函数必须在主线程中运行.
  3. 工作线程一直等待, 直到函数返回.

如果使用条件变量来实现:

  1. 工作线程并不直接调用自定义函数, 而是创建一个 uv_async_t 句柄, 然后由该句柄的回调函数调用自定义函数.
  2. 初始化条件变量.
  3. 使用 uv_async_send() 获得主线程(运行事件循环的线程)并由主线程调用该函数.
  4. 等待条件变量的通知.
  5. 回调函数调用自定义函数, 并向条件变量发送通知, 使得工作线程得以继续下去.

而事件循环的实现方式为:

  1. 在工作线程中创建一个新的事件循环.
  2. uv_async_t 与事件循环相关联.
  3. 将该句柄通过 uv_async_t 结构 data 字段传递给主线程.
  4. uv_run() 运行事件循环, 此时程序会阻塞, 因为异步句柄自增了它的 refcount.
  5. 主线程的回调函数再调用自定义函数,然后调用 uv_async_send 向事件循环的异步句柄发送消息.
  6. 异步句柄的回调函数关闭自己, 然后事件循环的引用计数减为 0, uv_run 返回, 工作线程得以继续下去.

libuv之事件循环loop

libuv强制使用异步的,事件驱动的编程风格。它的核心工作是提供一个event-loop,还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具,例如定时器,非阻塞的网络支持,异步文件...
  • js_gary
  • js_gary
  • 2017年05月16日 16:52
  • 925

libuv之线程池的坑,注意避免

libuv的uv_queue_work 使用,不能在fork的子进程中使用,原因未调查清楚,记录一下! 望有清楚的提点一下,谢谢...
  • wangcg123
  • wangcg123
  • 2016年08月31日 16:13
  • 1813

Libuv多路事件循环(Multiple event loops)

libuv文档
  • wangcg123
  • wangcg123
  • 2016年08月31日 16:38
  • 1400

基于libuv的TCP设计(二)

一、本人设想的TCP服务器有如下特性: 1.启动服务,一直监听端口。 2.有新连接(客户端)就通知用户。并把连接接收到的数据回调给用户。 3.客户端连接上后用户可在任意时间发送数据给它。 4....
  • cupidove
  • cupidove
  • 2015年01月23日 15:21
  • 2089

库-libuv:概述

libuv 是 Node 的新跨平台抽象层,用于抽象 Windows 的 IOCP 及 Unix 的 libev。作者打算在这个库的包含所有平台的差异性。 特性: 非阻塞 TCP 套接字 ...
  • w616589292
  • w616589292
  • 2016年03月18日 08:56
  • 10406

利用Libuv编写异步多线程的addon实例

利用libuv编写异步多线程的addon实例   最近cnode上很多TX在问关于node的异步回调以及单线程的事情,今天看了libuv的一些api和demo,自己简单写了一个利用libuv实现...
  • zhu2695
  • zhu2695
  • 2016年04月25日 23:04
  • 684

libuv 线程池的调度

原文:http://docs.libuv.org/en/latest/threadpool.html libuv提供threadpool可以用来在循环线程中运行用户代码和得到通知。这个内部线程池是用来...
  • lc250123
  • lc250123
  • 2016年09月26日 13:05
  • 754

Libuv中文文档之线程

libuv
  • wangcg123
  • wangcg123
  • 2016年08月31日 16:37
  • 1765

libuv多线程处理的简单示例

简介 libuv提供了多线程处理的封装,使用起来也非常简单,一个handle,即uv_thread_t,在linux环境下,就是pthread_t,也就是unsigned long类型。相关的三个函数...
  • limite_god
  • limite_god
  • 2015年02月09日 10:41
  • 4080

libuv 使用点滴

对于一个纯C语言实现的网络库来说,libuv 作为Node的跨平台抽象层,有着良好的性能,有Node 这个成熟项目提供营养,其可用性有了保障。但有些地方还是比较晦涩。最近在写一个C/S架构项目,服务器...
  • bywayboy
  • bywayboy
  • 2015年07月29日 23:24
  • 4515
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Libuv多路事件循环(Multiple event loops)
举报原因:
原因补充:

(最多只允许输入30个字)