Nginx的http核心模块ngx_http_core_module中提供limit_rate这个指令可以用于控制速度,limit_rate_after用于设置http请求传输多少字节后开始限速。 另外两个模块ngx_http_limit_conn_module和ngx_http_limit_req_module分别用于连接数和连接频率的控制。
libevent是一个事件通知库,适用于windows、linux、bsd等多种平台,内部使用select、epoll、kqueue、IOCP等系统调用管理事件机制。著名分布式缓存软件memcached也是基于libevent,而且libevent在使用上可以做到跨平台,而且根据libevent官方网站上公布的数据统计,似乎也有着非凡的性能。 libevent支持用户使用三种类型的事件,分别是网络IO、定时器、信号三种,最新版本在定时器的实现上使用了最小堆的数据结构,以达到高效查找、排序、删除定时器的目的,IO和信号的实现均使用了双向队列(用链表实现)。网络IO上,主要关注了一下linux上的epoll(因为目前的开发主要在linux平台),结果发现libevent的epoll居然用的EPOLLLT,水平触发的方式用起来比较方便,不容易出错,但是在效率上可能比EPOLLET要低一些。 libevent包括事件管理、缓存管理、DNS、HTTP、缓存事件几大部分。事件管理包括各种IO(socket)、定时器、信号等事件;缓存管理是指evbuffer功能;DNS是libevent提供的一个异步DNS查询功能;HTTP是libevent的一个轻量级http实现,包括服务器和客户端。libevent也支持ssl,这对于有安全需求的网络程序非常的重要,但是其支持不是很完善,比如http server的实现就不支持ssl。
The Sieve of Eratosthees 爱拉托逊斯筛选法思想:对于不超过n的每个非负整数P,删除2P, 3P…,当处理 完所有数之后,还没有被删除的就是素数。 若用vis==1表示已被删除,则代码如下: memset(vis, 0, sizeof(vis)); for(int i = 2; i <= 100; i++) for(int j = i*2; j <= 100; j += i) vis[j] = 1; 改进的代码: int m = sqrt(double(n+0.5));
每个线程除了共享进程的资源外还拥有各自的私有资源: 一个寄存器组(或者说是线程上下文);一个专属的堆栈;一个专属的消息队列;一个专属的Thread Local Storage(TLS);一个专属的结构化异常处理串链。
需要使用Go ID的场景, 比如在多goroutine长时间运行任务的时候,我们通过日志来跟踪任务的执行情况,可以通过go id来大致地跟踪程序并发执行的时候的状况。