poll

NodeJs的Event Loop

倾然丶 夕夏残阳落幕 提交于 2019-11-27 23:39:14
我们之前谈过浏览器的Event Loop: https://www.cnblogs.com/amiezhang/p/11349450.html 简单来说,就是每执行一个宏任务,就去执行微任务队列,直到清空,再执行下个宏任务。 那么NodeJs的Event Loop是怎么样的呢? NodeJS的Event Loop NodeJs的Event Loop其实也分了宏任务和微任务 不同的是,不是每执行一个宏任务就回去清空一次微任务队列,可能是连着执行好几个才去清空一次微任务队列。 例子: setTimeout(()=>{ console.log(1); new Promise(resolve=>resolve()).then(()=>console.log(3)) }) setTimeout(()=>{console.log(2)}) 同一个例子,在浏览器和Node环境下,输出不一致。 浏览器: NodeJs: 可以看出: 浏览器 在执行第一个 setTimeout 宏任务时,往微任务队列推了一个 console.log(3 ),所以在执行完第一个setTimeout后,浏览器的 Event Loop 机制马上去执行微任务队列,然后再执行下个setTimeout宏任务 NodeJs 在执行第一个 setTimeout 宏任务时,也往微任务队列推了一个 console.log(3)

一个超级简单的服务器框架

你离开我真会死。 提交于 2019-11-27 23:24:57
1. 本服务器端框架采用epoll+线程池+任务队列 2. Epoll和sernasock是我封装的,ThreadPool用的是 http://blog.csdn.net/shreck66/article/details/50412986 Epoll.h /** * by:gzh * 2017.12.12 * 可以改进的地方:EPOLLIN 接收数据read()处可以优化, * 现在每次可以接收1kb的数据 */ #ifndef _GZH_EPOLL_H_ #define _GZH_EPOLL_H_ #include <vector> #include <functional> #include <condition_variable> #include <list> #include "net.h" namespace gzhlib { class GzhEpoll { public: typedef int Socket; typedef struct epoll_event EpollEvent; typedef struct sockaddr_in SocketAddr; typedef socklen_t SockLen; typedef std::tuple<Socket, const char*> ClientMessageTuple; typedef std:

【IO多路复用】

核能气质少年 提交于 2019-11-27 21:11:43
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

django实例:用创建你的第一个应用投票系统

岁酱吖の 提交于 2019-11-27 18:23:15
https://docs.djangoproject.com/en/1.5/intro/tutorial03/ 投票应用的原文讲解的更加详细 当然主要是从django的帮助文档里面来的,权当是翻译吧 这个投票系统的主要功能有 1、一个前台页面,可以让用户来投票 2、一个管理员页面,可以用来添加、修改、删除投票 首页第一步要确定你已经安装了Django,可用如下方法来查看 python -c "import django; print(django.get_version())" 如果Django已经安装了,则会输出相应的版本,如果没有,或者安装不正确的话会出现如下错误 No module named django 这个应该的Django和Python版本分别为: Django 1.5 and Python 2.x 1、创建项目 首页在命令窗口中,用cd 进入到你想要放置代码的目录,然后执行如下命令创建项目 django-admin.py startproject mysite 创建的项目目录结构如下 mysite/ manage.py mysite/ __init__.py settings.py urls.py wsgi.py 下面再说说这几个目录和文件吧 1、根目录mysite:这个主要是用来存放生成的项目代码的,和项目没有关系,这个目录的名字你可以随便重命名 2、manage

【IO多路复用】 -- 2019-08-16 22:21:40

南笙酒味 提交于 2019-11-27 13:59:13
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

深入了解epoll 函数

偶尔善良 提交于 2019-11-27 13:54:13
一、 介绍 Epoll 是一种高效的管理socket的模型,相对于select和poll来说具有更高的效率和易用性。传统的select以及poll的效率会因为 socket数量的线形递增而导致呈二次乃至三次方的下降,而epoll的性能不会随socket数量增加而下降。标准的linux-2.4.20内核不支持epoll,需要打patch。本文主要从linux-2.4.32和linux-2.6.10两个内核版本介绍epoll。 二、 Epoll的使用 epoll用到的所有函数都是在头文件sys/epoll.h中声明的,下面简要说明所用到的数据结构和函数: 所用到的数据结构 typedef union epoll_data { void ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t; struct epoll_event { __uint32_t events; / Epoll events / epoll_data_t data; / User data variable / }; 结构体epoll_event 被用于注册所感兴趣的事件和回传所发生待处理的事件,其中epoll_data 联合体用来保存触发事件的某个文件描述符相关的数据,例如一个client连接到服务器

【IO多路复用】 -- 2019-08-16 19:17:42

断了今生、忘了曾经 提交于 2019-11-27 13:34:11
原文: http://blog.gqylpy.com/gqy/234 " 目录 一、IO模型介绍 二、阻塞IO(blocking IO) 三、非阻塞IO(non-blocking IO) 四、多路复用IO(IO multiplexing) 五、异步IO(Asynchronous I/O) 六、模型比较分析 七、关于select、poll、epoll 一、IO模型介绍 为了更好地了解IO模型,我们需要事先回顾下: 同步、异步、阻塞、非阻塞 同步(synchronous) IO和异步(asynchronous) IO,阻塞(blocking) IO和非阻塞(non-blocking)IO分别是什么,到底有什么区别?这个问题其实不同的人给出的答案都可能不同,比如wiki,就认为asynchronous IO和non-blocking IO是一个东西。这其实是因为不同的人的知识背景不同,并且在讨论这个问题的时候上下文(context)也不相同。所以,为了更好的回答这个问题,我先限定一下本文的上下文。 本文讨论的背景是Linux环境下的network IO。本文最重要的参考文献是Richard Stevens的“UNIX® Network Programming Volume 1, Third Edition: The Sockets Networking ”,6.2节“I/O Models

Kafka单线程Consumer及参数详解

随声附和 提交于 2019-11-27 12:13:22
请使用0.9以后的版本: 示例代码 Properties props = new Properties(); props.put("bootstrap.servers", "kafka01:9092,kafka02:9092"); props.put("group.id", "test"); props.put("enable.auto.commit", "true"); props.put("auto.commit.interval.ms", "1000"); props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); props.put("auto.offset.reset","earliest"); KafkaConsumer<String, String> consumer = new KafkaConsumer<>(props); consumer.subscribe(Arrays.asList("foo", "bar")); try{ while (true) {

关于同步,异步,阻塞,非阻塞,IOCP/epoll,select/poll,AIO ,NIO ,BIO的总结

谁说胖子不能爱 提交于 2019-11-27 08:04:44
昨天面试的时候没有答上来同步与异步,阻塞与非阻塞的区别,回来搜了一下,发现这篇文章写的不错,转载学习一下,链接如下: https://blog.csdn.net/chen8238065/article/details/48315085 相关资料 IO基本概念 Linux环境 同步异步阻塞非阻塞 同步与异步 阻塞与非阻塞 IO模型Reference Link 阻塞IO模型 非阻塞IO模型 IO复用模型 信号驱动异步IO模型 异步IO模型 总结 AIOBIONIO Java对BIONIOAIO的支持 AIOReference Link1ReferenceLink2 NIOReference Link epollselectpollReference Link LTETepoll select的几大缺点 poll实现 epollreference Link 总结 IOCP ReferenceLinkConcreteRealization 相关资料 IO基本概念 Linux环境 Linux的内核将所有外部设备都可以看做一个文件来操作。那么我们对与外部设备的操作都可以看做对文件进行操作。我们对一个文件的读写,都通过调用内核提供的系统调用;内核给我们返回一个file descriptor(fd,文件描述符)。对一个socket的读写也会有相应的描述符,称为socketfd(socket描述符)

Python探路-Nginx

假装没事ソ 提交于 2019-11-27 03:37:28
一直向写关于nginx的博客但是一直没有能够将nginx的内容形成自己的知识体系,所有没有勇气写下去。今天鼓起勇气写下这篇博客,也希望借此形成对nginx的整体认识。 首先看下nginx的进程模型: nginx一般是通过一个master进程+多个worker进程(和cpu核数一样多)的模式工作的。worker是master进程通过fork出来的,master用来监听连接,然后把连接交给worker进行处理和交互,除此之外,master还会监控worker进程的运行状态,如果有worker异常退出时,master还会重新启动新的worker。 那nginx是采用哪种方式工作的呢?答案是: 异步非阻塞 ,nginx一般启动多进程的方式,进程数和核数一致,而不会使用多线程,这是由于线程之间的切换会消耗cpu和内存,这也是nginx为什么能够使用异步非阻塞的原因,针对一个进程,它的任务就是不断的处理epoll里面的任务,当有任务被唤醒时就会被放到epoll中等待处理,如果epoll为空才会进入阻塞状态。 结合一个tcp连接的生命周期,我们看看nginx是如何处理一个连接的。首先,nginx在启动时,会解析配置文件,得到需要监听的端口与ip地址,然后在nginx的master进程里面,先初始化好这个监控的socket(创建socket,设置addrreuse等选项,绑定到指定的ip地址端口