epoll

python网络编程(进程与多线程)

梦想的初衷 提交于 2020-08-17 00:00:14
multiprocessing模块   由于GIL的存在,python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。   multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该进程可以运行在Python程序内部编写的函数。该Process对象与Thread对象的用法相同,也有start(), run(), join()的方法。   此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。   multiprocessing模块的功能众多:支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件,进程没有任何共享状态,进程修改的数据,改动仅限于该进程内。   Process类的介绍 Process(target = talk,args = (conn,addr)) #

一个工业级、跨平台、轻量级的 tcp 网络服务框架:gevent

允我心安 提交于 2020-08-16 10:27:10
作为公司的公共产品,经常有这样的需求:就是新建一个本地服务,产品线作为客户端通过 tcp 接入本地服务,来获取想要的业务能力。 与印象中动辄处理成千上万连接的 tcp 网络服务不同,这个本地服务是跑在客户机器上的,Win32 上作为开机自启动的 windows 服务运行; Linux 上作为 daemon 在后台运行。总的说来就是用于接收几个产品进程的连接,因此轻量化是其最重要的要求,在这个基础上要能兼顾跨平台就可以了。 其实主要就是 windows,再兼顾一点儿 linux。 考察了几个现有的开源网络框架,从 ACE 、boost::asio 到 libevent,都有不尽于人意的地方: a) ACE:太重,只是想要一个网络框架,结果它扒拉扒拉一堆全提供了,不用还不行; b) boost::asio:太复杂,牵扯到 boost 库,并且引入了一堆 c++ 模板,需要高版本 c++ 编译器支持; c) libevent:这个看着不错,当时确实用这个做底层封装了一版,结果发版后发现一个比较致命的问题,导致在防火墙设置比较严格的机器上初始化失败,这个后面我会详细提到。 其它的就更不用说了,之前也粗略看过陈硕的 muddo,总的感觉吧,它是基于其它开源框架不足地方改进的一个库,有相当可取的地方,但是这个改进的方向也主要是解决更大并发、更多连接,不是我的痛点,所以没有继续深入研究。 好了

图解Linux的IO模型和相关技术

时间秒杀一切 提交于 2020-08-16 08:22:38
阻塞IO模型(Blocking I/O) Linux 内核一开始提供了 read 与 write 阻塞式操作。 当客户端连接时,会在对应进程的文件描述符目录(/proc/进程号/fd)生成对应的文件描述符(0 标准输入;1 标准输出;2 标准错误输出;),比如 fd 8 , fd 9; 应用程序需要读取的时候,通过系统调用 read (fd8) 读取,如果数据还没到来,此应用程序的进程或线程会阻塞等待。 man 2 read 概述 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 描述 read() 从文件描述符 fd 中读取 count 字节的数据并放入从 buf 开始的缓冲区中. 如果 count 为零,read()返回0,不执行其他任何操作. 如果 count 大于SSIZE_MAX,那么结果将不可预料. 返回值 成功时返回读取到的字节数(为零表示读到文件描述符), 此返回值受文件剩余字节数限制.当返回值小于指定的字节数时 并不意味着错误;这可能是因为当前可读取的字节数小于指定的 字节数(比如已经接近文件结尾,或 者正在从管道或者终端读取数 据,或者 read()被信号中断). 发生错误时返回-1,并置 errno 为相应值.在这种情况下无法得知文件偏移位置是否有变化. 问题

Tomcat的作用思考及NIO的应用(要区分Java NIO和操作系统的NIO模型)

岁酱吖の 提交于 2020-08-14 11:38:04
Tomcat的作用   平时写完web程序都是直接点击启动,就可以在本机浏览器访问了。但是仔细想想,我们似乎都没有写过浏览器与servlet通信的代码,也没有写过创建request、reponse的代码。实际上,这些都是由Tomcat完成的,它的主要作用如下:   1. 完成服务的与客户端的数据收发,即通信功能。   2. 完成请求的映射功能。   3. 管理servlet的生命周期。 Tomcat的工作模型(图片来源于网络): connector用于处理连接相关的事情,并提供Socket与Request和Response相关的转化; Container用于封装和管理Servlet,以及具体处理Request请求; 一个Tomcat中只有一个Server,一个Server可以包含多个Service,一个Service只有一个Container,但是可以有多个Connectors,这是因为一个服务可以有多个连接,如同时提供Http和Https链接,也可以提供向相同协议不同端口的连接。为了方便,Engine可以直接看成我们编写的服务器程序,即servlet。 Tomcat的BIO工作模型   客户端与服务端建立的TCP连接, 线程在等待其对应的客户端连接发送数据时是不能做其它事的,一直在阻塞中 。也因此有N个客户端与服务端建立了连接,就必须要N条线程去处理。工作模型如下:

nginx 配置参数详解

点点圈 提交于 2020-08-14 11:32:00
[root@WEBServer10414 ~]# cat /etc/nginx/nginx.conf #user nobody;#定义nginx运行的用户和用户组 user root; worker_processes 8;#nginx进程数,建议设置为等于CPU总核心数 #error_log logs/error.log;#错误日志路径 #error_log logs/error.log notice;#错误日志类型,如[debug | info | notice | warn | error | crit ] #error_log logs/error.log info;错误日志类型 #pid logs/nginx.pid;#进程文件 worker_rlimit_nofile 51200;#一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(系统的值ulimit) events {#工作模式与连接数上限 use epoll;#参考事件模型[ kqueue | rtsig | epoll | /dev/poll | select | poll ]; worker_connections 51200;#单个进程最大连接数 } http {#设定http服务器 include mime.types; #文件扩展名与文件类型映射表 default_type

微服务开源框架TARS的RPC源码解析 之 初识TARS C++服务端

偶尔善良 提交于 2020-08-14 09:25:27
作者:Cony 导语:微服务开源框架TARS的RPC调用包含客户端与服务端,《微服务开源框架TARS的RPC源码解析》系列文章将从初识客户端、客户端的同步及异步调用、初识服务端、服务端的工作流程四部分,以C++语言为载体,深入浅出地带你了解TARS RPC调用的原理。 什么是TARS TARS是腾讯使用十年的微服务开发框架,目前支持C++、Java、PHP、Node.js、Go语言。该开源项目为用户提供了涉及到开发、运维、以及测试的一整套微服务平台PaaS解决方案,帮助一个产品或者服务快速开发、部署、测试、上线。目前该框架应用在腾讯各大核心业务,基于该框架部署运行的服务节点规模达到数十万。 TARS的通信模型中包含客户端和服务端。客户端服务端之间主要是利用RPC进行通信。本系列文章分上下两篇,对RPC调用部分进行源码解析。本文是下篇,我们将以C++语言为载体,带大家了解一下TARS的服务端。 初识服务端 在使用TARS构建RPC服务端的时候,TARS会帮你生成一个XXXServer类,这个类是继承自Application类的,声明变量XXXServer g_app,以及调用函数: g_app.main(argc, argv); g_app.waitForShutdown(); 便可以开启TARS的RPC服务了。在开始剖析TARS的服务端代码之前,先介绍几个重要的类

Android Hook框架adbi的分析(2)--- inline Hook的实现

有些话、适合烂在心里 提交于 2020-08-14 07:04:51
本文博客地址: http://blog.csdn.net/qq1084283172/article/details/74452308 一、 Android Hook框架adbi源码中inline Hook实现部分的代码结构 Android Hook框架adbi源码中inline Hook部分的实现代码结构示意图如下所示,hijack代码部分是前面的博客中提到的root下Android跨进程注入so的注入工具,instruments\base代码部分为inline Hook的操作实现,instruments\example代码部分则为Android Hook框架adbi实现Hook系统调用函数epoll_wait的使用例子。 二、 adbi源码中inline Hook实现的详细步骤分析 1 .inline Hook函数被调用的时机 在so库文件加载的时候,会首先执行.init段的构造函数,因此在编写注入到Android目标进程中的so库文件时要定义该构造函数并实现在此处调用inline Hook。inline Hook实现就是在so库文件注入到Android进程中被加载调用该构造函数时被执行的。Android Hook框架adbi基于模块化的设计思想,该构造函数的编写是放在自定义Hook函数的接口中来实现的,在这里就是在Hook函数代码示例instruments\example

Reactor和Proactor对比

試著忘記壹切 提交于 2020-08-14 03:23:18
常见的IO事件处理模型有两种:Reactor和Proactor。Redis中的ae就是采用的Reactor事件处理模型,Proactor需要操作系统的支持,目前暂时还没接触到相关的使用场景,主要是学习模型结构。 Reactor模型 Handler :用来标识一个文件描述符 Synchronous Event Demultiplexer :同步事件多路分解器,由select、poll或者epoll函数来实现,调用后会阻塞,直到等待Handler上的一个或多个事件发生 Event Handler :事件处理接口 Concrete Event Handler :事件处理接口的实现类,用来实现应用程序所提供的特定事件处理逻辑 Reactor :Reactor反应堆,主要实现以下功能: 1)注册和删除关注的文件描述符 2)运行事件循环 3)有就绪事件到来时,分发事件到之前注册的回调函数上处理 Reactor时序图 运行主程序,将关注的事件handler注册到Reactor中 主程序调用Reactor,进入无限事件循环,等待注册的事件到来 当事件到来时,调用select返回待处理的事件,Reactor将事件分发到之前注册的回调函数中去处理 Proactor模型 Handler :用来标识一个文件描述符; Asynchronous Operation Processor :异步操作处理器

Redis凭啥这么快?只能做缓存?架构师道出了真相(颠覆你的认知)

纵然是瞬间 提交于 2020-08-14 00:32:18
Redis到底有多快 Redis采用的是基于内存的采用的是 单进程单线程 模型的 KV 数据库 , 由C语言编写 ,官方提供的数据是可以达到100000+的QPS(每秒内查询次数)。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差!有兴趣的可以参考官方的基准程序测试《 How fast is Redis? 》( redis.io/topics/benchma ) 横轴是连接数,纵轴是QPS 。此时,这张图反映了一个数量级,希望大家在面试的时候可以正确的描述出来,不要问你的时候,你回答的数量级相差甚远! Redis为什么这么快 1、完全基于内存,绝大部分请求是纯粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1); 2、数据结构简单,对数据操作也简单,Redis中的数据结构是专门进行设计的; 3、采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗; 4、使用多路I/O复用模型,非阻塞IO; 5、使用底层模型不同,它们之间底层实现方式以及与客户端之间通信的应用协议不一样,Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话

nginx理论基础

不想你离开。 提交于 2020-08-13 23:03:04
一、 Nginx 简介 Nginx 在架构中发挥的作用 网关 --- 面向客户的总入口。 虚拟主机 --- 一台机器为不同的域名 /ip/ 端口提供服务 路由 --- 使用反向代理,整合后续服务为一个完整业务 静态服务器 ---mvvm 模式中,用来发布前端 html/css/js/img 负载集群 --- 使用 upstream ,负载多个 tomcat 二、 Nginx 架构设计 2.1. Nginx 的模块化设计 高度模块化的设计是 Nginx 的架构基础。 Nginx 服务器被分解为多个模块,每个模块就是 一个功能模块,只负责自身的功能,模块之间严格遵循 “ 高内聚,低耦合 ” 的原则。 核心模块 核心模块是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录、配置文件解析、 事件驱动机制、进程管理等核心功能。 标准 HTTP 模块 标准 HTTP 模块提供 HTTP 协议解析相关的功能,如:端口配置、网页编码设置、 HTTP 响应头设置等。 可选 HTTP 模块 可选 HTTP 模块主要用于扩展标准的 HTTP 功能,让 Nginx 能处理一些特殊的服务,如: Flash 多媒体传输、解析 GeoIP 请求、 SSL 支持等。 邮件服务模块 邮件服务模块主要用于支持 Nginx 的邮件服务,包括对 POP3 协议、 IMAP 协议和 SMTP 协议的支持。