当前位置: 首页 > news >正文

青岛建设教育网站如何在手机上学编程

青岛建设教育网站,如何在手机上学编程,网络营销方案500字,做推广类门户网站怎么样Basics of libuv libuv强制使用异步和事件驱动的编程风格。它的核心工作是提供一个event-loop#xff0c;还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具#xff0c;例如定时器#xff0c;非阻塞的网络支持#xff0c;异步文件系统访问#xff0c;子进…Basics of libuv libuv强制使用异步和事件驱动的编程风格。它的核心工作是提供一个event-loop还有基于I/O和其它事件通知的回调函数。libuv还提供了一些核心工具例如定时器非阻塞的网络支持异步文件系统访问子进程等。 Event loops 在事件驱动编程中程序会关注每一个事件并且对每一个事件的发生做出反应。libuv会负责将来自操作系统的事件收集起来或者监视其他来源的事件。这样用户就可以注册回调函数回调函数会在事件发生的时候被调用。event-loop会一直保持运行状态。用伪代码描述如下 while there are still events to process:e get the next eventif there is a callback associated with e:call the callback举几个事件的例子 准备好被写入的文件。包含准备被读取的数据的socket。超时的定时器。 event-loop最终会被uv_run()启动当使用libuv时最后都会调用的函数。 系统编程中最经常处理的一般是输入和输出而不是一大堆的数据处理。问题在于传统的输入/输出函数(例如readfprintf)都是阻塞式的。实际上向文件写入数据从网络读取数据所花的时间对比CPU的处理速度差得太多。任务没有完成函数是不会返回的所以你的程序在这段时间内什么也做不了。对于需要高性能的的程序来说这是一个主要的障碍因为其他活动和I/O操作都在保持等待。 其中一个标准的解决方案是使用多线程。每一个阻塞的I/O操作都会被分配到各个线程中或者是使用线程池。当某个线程一旦阻塞处理器就可以调度处理其他需要cpu资源的线程。 但是libuv使用了另外一个解决方案那就是异步非阻塞风格。大多数的现代操作系统提供了基于事件通知的子系统。例如一个正常的socket上的read调用会发生阻塞直到发送方把信息发送过来。但是实际上程序可以请求操作系统监视socket事件的到来并将这个事件通知放到事件队列中。这样程序就可以很简单地检查事件是否到来可能此时正在使用cpu做数值处理的运算并及时地获取数据。说libuv是异步的是因为程序可以在一头表达对某一事件的兴趣并在另一头获取到数据对于时间或是空间来说。它是非阻塞是因为应用程序无需在请求数据后等待可以自由地做其他的事。libuv的事件循环方式很好地与该模型匹配, 因为操作系统事件可以视为另外一种libuv事件. 非阻塞方式可以保证在其他事件到来时被尽快处理当然还要考虑硬件的能力。 Note 我们不需要关心I/O在后台是如何工作的但是由于我们的计算机硬件的工作方式线程是处理器最基本的执行单元libuv和操作系统通常会运行后台/工作者线程, 或者采用非阻塞方式来轮流执行任务。 Bert Belder一个libuv的核心开发者通过一个短视频向我们解释了libuv的架构和它的后台工作方式。如果你之前没有接触过类似libuvlibev这个视频会非常有用。视频的网址是https://youtu.be/nGn60vDSxQ4 。 包含了libuv的event-loop的更多详细信息的文档。 HELLO WORLD 让我们开始写第一个libuv程序吧它什么都没做只是开启了一个loop然后很快地退出了。 helloworld/main.c #include stdio.h #include stdlib.h #include uv.hint main() {uv_loop_t *loop malloc(sizeof(uv_loop_t));uv_loop_init(loop);printf(Now quitting.\n);uv_run(loop, UV_RUN_DEFAULT);uv_loop_close(loop);free(loop);return 0; }这个程序会很快就退出了因为没有可以很处理的事件。我们可以使用各种API函数来告诉event-loop我们要监视的事件。 从libuv的1.0版本开始用户就可以在使用uv_loop_init初始化loop之前给其分配相应的内存。这就允许你植入自定义的内存管理方法。记住要使用uv_loop_close(uv_loop_t *)关闭loop然后再回收内存空间。在例子中程序退出的时候会关闭loop系统也会自动回收内存。对于长时间运行的程序来说合理释放内存很重要。 Default loop 可以使用uv_default_loop获取libuv提供的默认loop。如果你只需要一个loop的话可以使用这个。 Note nodejs中使用了默认的loop作为自己的主loop。如果你在编写nodejs的绑定你应该注意一下。 Error handling 初始化函数或者同步执行的函数会在执行失败后返回代表错误的负数。但是对于异步执行的函数会在执行失败的时候给它们的回调函数传递一个状态参数。错误信息被定义为UV_E*常量。 你可以使用uv_strerror(int)和uv_err_name(int)分别获取const char *格式的错误信息和错误名字。 I/O函数的回调函数例如文件和socket等会被传递一个nread参数。如果nread小于0就代表出现了错误当然UV_EOF是读取到文件末端的错误你要特殊处理。 ##Handles and Requests libuv的工作建立在用户表达对特定事件的兴趣。这通常通过创造对应I/O设备定时器进程等的handle来实现。handle是不透明的数据结构其中对应的类型uv_TYPE_t中的type指定了handle的使用目的。 libuv watchers /* Handle types. */ typedef struct uv_loop_s uv_loop_t; typedef struct uv_handle_s uv_handle_t; typedef struct uv_stream_s uv_stream_t; typedef struct uv_tcp_s uv_tcp_t; typedef struct uv_udp_s uv_udp_t; typedef struct uv_pipe_s uv_pipe_t; typedef struct uv_tty_s uv_tty_t; typedef struct uv_poll_s uv_poll_t; typedef struct uv_timer_s uv_timer_t; typedef struct uv_prepare_s uv_prepare_t; typedef struct uv_check_s uv_check_t; typedef struct uv_idle_s uv_idle_t; typedef struct uv_async_s uv_async_t; typedef struct uv_process_s uv_process_t; typedef struct uv_fs_event_s uv_fs_event_t; typedef struct uv_fs_poll_s uv_fs_poll_t; typedef struct uv_signal_s uv_signal_t;/* Request types. */ typedef struct uv_req_s uv_req_t; typedef struct uv_getaddrinfo_s uv_getaddrinfo_t; typedef struct uv_getnameinfo_s uv_getnameinfo_t; typedef struct uv_shutdown_s uv_shutdown_t; typedef struct uv_write_s uv_write_t; typedef struct uv_connect_s uv_connect_t; typedef struct uv_udp_send_s uv_udp_send_t; typedef struct uv_fs_s uv_fs_t; typedef struct uv_work_s uv_work_t;/* None of the above. */ typedef struct uv_cpu_info_s uv_cpu_info_t; typedef struct uv_interface_address_s uv_interface_address_t; typedef struct uv_dirent_s uv_dirent_t;handle代表了持久性对象。在异步的操作中相应的handle上有许多与之关联的request。request是短暂性对象通常只维持在一个回调函数的时间通常对映着handle上的一个I/O操作。Requests用来在初始函数和回调函数之间传递上下文。例如uv_udp_t代表了一个udp的socket然而对于每一个向socket的写入的完成后都会向回调函数传递一个uv_udp_send_t。 handle可以通过下面的函数设置 uv_TYPE_init(uv_loop_t *, uv_TYPE_t *)回调函数是libuv所关注的事件发生后所调用的函数。应用程序的特定逻辑会在回调函数中实现。例如一个IO监视器的回调函数会接收到从文件读取到的数据一个定时器的回调函数会在超时后被触发等等。 Idling 下面有一个使用空转handle的例子。回调函数在每一个循环中都会被调用。在Utilities这部分会讲到一些空转handle的使用场景。现在让我们使用一个空转监视器然后来观察它的生命周期接着看uv_run调用会造成阻塞。当达到事先规定好的计数后空转监视器会退出。因为uv_run已经找不到活着的事件监视器了所以uv_run()也退出。 idle-basic/main.c #include stdio.h #include uv.hint64_t counter 0;void wait_for_a_while(uv_idle_t* handle) {counter;if (counter 10e6)uv_idle_stop(handle); }int main() {uv_idle_t idler;uv_idle_init(uv_default_loop(), idler);uv_idle_start(idler, wait_for_a_while);printf(Idling...\n);uv_run(uv_default_loop(), UV_RUN_DEFAULT);uv_loop_close(uv_default_loop());return 0; } Storing context 在基于回调函数的编程风格中你可能会需要在调用处和回调函数之间传递一些上下文等特定的应用信息。所有的handle和request都有一个data域可以用来存储信息并传递。这是一个c语言库中很常见的模式。即使是uv_loop_t也有一个相似的data域。
http://www.hkea.cn/news/14487986/

相关文章:

  • 效果好的锦州网站建设国外扁平化风格网站
  • 顺德龙江做网站义乌网页制作
  • 天津微信网站建设asp大型网站开发
  • 免费海报在线制作网站wordpress结合小程序
  • 无锡企业网站制作费用网站代备案流程图
  • 大学生学风建设专题网站工作室赚钱项目
  • 电子商务网站建设方案的总结网站建设的基本流程和技术规范
  • 舞蹈东莞网站建设干零活一天一结的平台
  • 网站大幅广告百度搜图入口
  • 网站开发费用周期有哪些做废品的网站
  • 媒易网络网站建设培训广州注册公司流程及资料
  • wordpress the loopseo的方法
  • 有专门下载地图做方案的网站吗石家庄网站建设德信互联科技有限公司
  • 深圳网站建设找哪家花的网页设计模板素材
  • 怎么做淘宝客网站做淘客自治区建设厅网站
  • 江门网站定制多少钱酒店网站方案
  • 如何给网站添加统计代码企业网站的设计论文
  • 婚纱网站模板素材百度竞价规则
  • 网站开发 activex网络优化软件下载
  • 婚恋网站应聘做销售广州住房和城乡建设厅网站首页
  • 哪家网站建设项目自主验收网站
  • 免费网站推荐软件商城站人工售票时间表
  • 深圳网站建设售后服务怎样怎么推广网页
  • 上海建设厅网站首页网站做优化的好处
  • 兖州网站建设推广哪些网站做商标注册
  • dw2018网页制作步骤图文排名网站优化培训
  • 湘潭建设厅官方网站建设厅网站给领导留言如何查看
  • 同城分类信息网站厦门电脑网站建设
  • 中心城网站建设做普通网站公司
  • 珠宝行业做网站的好处怎么建立自己的网站域名