事件驱动

事件驱动编程

不问归期 提交于 2020-02-05 11:49:00
看完公司的基于Netty的游戏框架,框架中用到了多态,函数式编程和事件驱动编程,第一次看到事件驱动的时候,就想到跟观察者模式很像. 事件驱动初上手感觉还很好用,在我自己写的项目里,要写很多爬虫,比如下面爬虫的例子,我只是想关心拼接URL地址,和关心不同的网站怎么解析DOM元素,写一个回调就好 多态,函数式编程和事件驱动编程,这三个还是然让我学到很多,可以用一个框架的基础,比如在Netty中,继承 SimpleChannelInboundHandler<TextWebSocketFrame> ,实现这里里面的方法,就能接收到请求,很方便. 1.JAVA回调的例子 /** * @Description java回调 * @Author Anthony * @Date 2019/6/15 */ interface Callback { Map<String,String> parse(String html); } public class CallbackDemo { // 爬虫工具类 static Map<String,String> send(String URL, Callback callback) { // 模拟爬虫返回的数据 String spiderResponse = ""; if ("http://www.baidu.com".equals(URL)) {

基于事件驱动的编程模型(C++asio网络库相关)

可紊 提交于 2020-01-23 11:45:49
基于事件驱动的编程模型 1、reactor模式:lighttpd,libevent,libev,poco 2、Proactor模式:Asio,locp rector模式简单一点 reactor模式: 有一个中心部分处理事件告诉回调通知 initiation dispatcher:中心模块,handle_events()调用synchronous event根据返回值知道handle哪些事件已经完成,然后再调用event handler synchronous event demultiplexer:处理io的事件分离器,如外部有玩家进来或触发IO事件 handle:一般网络连接socket(最终要处理的) 大部分单线程服务器都用这个模式 如handle被通知可以发送一份数据,最终发送通过event_handler完成 缺点: 所有逻辑跑一起,event handler容易阻塞,如新用户登录要拉数据 proactor模式: 很多proactor本身可以由reactor模拟实现 initor:发起者(socket)绑定最终回调 aop:自身当成一个事件放入队列 proactor:事件分发查看哪些事件已经完成,调用最终回调 调用最终回调时一定是某事件已经完成 reactor调用最终回调时是将要做某件事情,proactor是先做事情做完调最终回调 单线程用此模型比较废

协程Coroutine

旧时模样 提交于 2020-01-12 23:47:36
协程是一种用户态的轻量级线程 。 server的发展如下: IO密集型应用: 多进程->多线程->事件驱动->协程 CPU密集型应用:多进程-->多线程 如果说多进程对于多CPU,多线程对应多核CPU,那么事件驱动和协程则是在充分挖掘不断提高性能的单核CPU的潜力。 异步事件驱动模型中,把会导致阻塞的操作转化为一个异步操作,主线程负责发起这个异步操作,并处理这个异步操作的结果。由于所有阻塞的操作都转化为异步操作,理论上主线程的大部分时间都是在处理实际的计算任务,少了多线程的调度时间,所以这种模型的性能通常会比较好。总的说来,当单核cpu性能提升,cpu不在成为性能瓶颈时,采用异步server能够简化编程模型,也能提高IO密集型应用的性能。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 在并发编程中,协程与线程类似,每个协程表示一个执行单元,有自己的本地数据,与其它协程共享全局数据和其它资源。目前主流语言基本上都选择了多线程作为并发设施,与线程相关的概念是抢占式多任务(Preemptive multitasking),而与协程相关的是

从零开始学asyncio(上)

六月ゝ 毕业季﹏ 提交于 2020-01-08 19:47:19
  这篇文章主要是介绍生成器和IO多路复用机制, 算是学习asyncio需要的预备知识. 这个系列还有另外两篇文章: 从零开始学asyncio(中) 从零开始学asyncio(下) 一. 简单爬虫实例   首先创建一个crawler.py文件, 写入以下代码: import socket req = 'GET / HTTP/1.0\r\nHost:cn.bing.com\r\n\r\n'.encode('utf8') address = ('cn.bing.com', 80) db = [] def simple_crawler(): sock = socket.socket() sock.connect(address) sock.send(req) response = b'' while 1: chunk = sock.recv(1024) if chunk == b'': sock.close() break else: response += chunk db.append(response) if __name__ == '__main__': print('开始爬取...') simple_crawler() print('获取到{}条数据'.format(len(db))) 运行crawler.py文件, 结果如下: 其中, simple

nginx源码分析——事件模块

给你一囗甜甜゛ 提交于 2020-01-07 04:59:46
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 1. 事件模块概述 事件处理框架所要解决的问题是如何收集,管理,分发事件。这里所说的事件,主要以网络事件和定时器事件为主,而网络事件中又以TCP网络事件为主。由于网络事件与网卡中断处理程序,内核提供的系统调用密切相关,所以网络事件的驱动取决于不同的操作系统平台,在同一操作系统中也受制于不同的操作系统内核版本。因此不同操作系统有不同的事件驱动机制。 基于模块化的设计思想,nginx对于事件处理分不同的模块来完成。首先是ngx_events_module,它是NGX_CORE_MODULE类型的模块,主要负责配置文件events块配置项的解析;其次是ngx_event_core_module,它是NGX_EVENTS_MODULE类型的模块,这个模块会决定使用哪种事件驱动机制,并且怎样调用事件驱动完成事件的管理;最后是ngx_epoll_module,ngx_kqueue_module,ngx_poll_module等一系列模块,这些模块实现了具体的事件驱动机制。 2. 事件模块间的抽象化及初始化流程 在模块接口ngx_module_t中,有一个指向模块上下文的指针,不同的模块采用不同的结构体。 对于NGX_EVENT_MODULE类型的模块,其上下文结构体为ngx_event_module_t: typedef

Web_文档对象模型与事件驱动

半城伤御伤魂 提交于 2020-01-07 00:35:59
1文档对象模型 1.1 概念 文档对象模型以 对象形式 描述 HTML页面和Web浏览器的层次结构 。 通过 访问或设置 文档对象模型中对象的 属性并调用其方法 ,可以使程序按照一定的方式 显示Web页面 ,并且与用户的动作 进行交互 。 1.3 引用文档对象模型中的对象 所有下层对象都是其上层对象的子对象。而子对象其实就是父对象的属性,所以引用子对象的方式,与引用对象的一般属性是相同 如: window . document . write ( "Hello" ) ; 由于window对象是默认的最上层对象,因此引用它的子对象时,可以不使用window: document . write ( "Hello" ) ; 当引用较低层次的对象时,要根据对象的包含关系,一层一层地引用对象。如: document . form1 . elementName 2 事件驱动 2.1 事件概念 1:在图形界面的环境下,用户操作鼠标或按键的动作以及系统操作如载入页面等 称为事件。 2:用户操作事件或系统操作事件引起一连串程序动作的执行方式, 称为事件驱动 。 3:为了响应某个事件而进行的处理过程, 称为事件处理 。 浏览器在程序运行的大部分时间都在等待交互事件的发生,并在事件发生时,自动调用、执行事件处理程序 2.3处理事件 事件名处于标记(元素)内,如: < INPUT type =

对node.js的理解?

旧巷老猫 提交于 2020-01-05 02:33:24
a、Node.js 是一个基于 Google Chrome V8 引擎的 javascript 运行环境。 Node.js 使用了一个事件驱动、非阻塞式 I/O 的模型,使其轻量又高效。 Node.js 的包管理器 npm ,是全球最大的开源库生态系统 b、 能方便地搭建相应速度快、易于扩展的网络应用, node.js 使用事件驱动,非阻塞 I/O 模型而得以轻量和高效,非常适合在分布式设备上运行的数据密集型的实时应用 c 、简单说 node.js 就是运行在服务器端的 JavaScript ,是现在流行的语言中能同时运行在前端与后台的程序语言 来源: https://www.cnblogs.com/sunyang-001/p/10792952.html

C#委托 委托示例 事件驱动

只谈情不闲聊 提交于 2020-01-04 02:36:07
C#委托 委托示例 事件驱动 using System; using System.Collections.Generic; using System.Text; using System.Threading; using System.Runtime.Remoting.Messaging; using System.IO; using System.Net; namespace ConsoleApplication2 { /// <summary> /// ************************************************************************* /// 程序作者:李伟涛 /// QQ:12666954 /// 传递消息,驱动事件 /// ************************************************************************* /// </summary> public struct Quitperson//定义逃课人的信息 { public string name; public string Class; } class client { public class CQuithireEventArgs:EventArgs { public readonly

0MQ 事件驱动 以及 poller

孤街浪徒 提交于 2020-01-03 02:40:47
底层IO事件,以及借用socket poller的上层0MQ socket事件。 先来看用于底层和上层的两种poller。 这是用于底层io事件的poller_t,每个socket_base_t都关联到一个poller_t,这个poller_t运行在io_thread_t线程上。 这是运行在0MQ socket层的事件poller。运行在你的控制线程,也就是你编程的线程。 每次你使用zmq_poller_poll都会创建一个sokcet_poller_t去进行poll。 我们要去轮询一个0MQ socket层事件,我们会通过zmq_poll将socket_base_t添加到poller而不是底层fd。 item_t的第二个成员是pollfd,在这里设置为0,表示并不使用fd进行poll。 下面再看socket_poller_t::wait 注释写得很清楚,并不是在poll底层的fd,在poll返回后,遍历所有socket_base_t,并getsocket去取ZMQ_EVENTS事件。zmq_poll被唤醒一般是0MQ socket通过signaler_t去发送唤醒信号。 再来看socket_poller_t::rebuild(), 这是每次socket_poller_t::wait()之初都调用的。 其中它为我们需要进行zmq_poll的socket_base

python 协程, 异步IO Select 和 selectors 模块 多并发演示

被刻印的时光 ゝ 提交于 2019-12-26 00:42:13
主要内容 Gevent协程 Select\Poll\Epoll异步IO与事件驱动 selectors 模块 多并发演示 协程 协程,又称微线程,纤程。英文名Coroutine。一句话说明什么是线程: 协程是一种用户态的轻量级线程 。 协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。因此: 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合),每次过程重入时,就相当于进入上一次调用的状态,换种说法:进入上一次离开时所处逻辑流的位置。 协程的好处: 无需线程上下文切换的开销 无需原子操作锁定及同步的开销   "原子操作(atomic operation)是不需要synchronized",所谓原子操作是指不会被线程调度机制打断的操作;这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。原子操作可以是一个步骤,也可以是多个操作步骤,但是其顺序是不可以被打乱,或者切割掉只执行部分。视作整体是原子性的核心。 方便切换控制流,简化编程模型 高并发+高扩展性+低成本:一个CPU支持上万的协程都不是问题。所以很适合用于高并发处理。 缺点: 无法利用多核资源:协程的本质是个单线程,它不能同时将 单个CPU 的多个核用上,协程需要和进程配合才能运行在多CPU上