4_queue_concurrent_web_spider
Queue example => 并发网络蜘蛛Tornado 的 tornado.queues 模块为协程实现了异步生产者/消费者模式,类似于 Python 标准库的队列模块为线程实现的模式。 产生 Queue.get 的协程会暂停,直到队列中有一个项目。如果队列有最大大小 se,则产生 Queue.put 的协程将暂停,直到有空间容纳另一个项目。 队列维护未完成任务的计数,从零开始。 put 增加计数; task_done 会减少它。 在此处的网络蜘蛛示例中,队列开始时仅包含 base_url。当工作人员获取页面时,它会解析链接并将新链接放入队列中,然后调用 task_done 来递减计数器 1。最终,worker 获取了一个其 URL 之前都已经见过的页面,并且队列中也没有剩余的工作。因此,该工作人员对 task_done 的调用会将计数器递减至零。正在等待加入的主协程未暂停并完成。 点击这里阅读web_spider.py
3_corountines
协奏曲协程是在 Tornado 中编写异步代码的推荐方法。协程使用 yield 或 await 关键字来挂起和恢复执行,而不是回调链(gevent 等框架中的协作轻量级线程有时也称为协程,但在 Tornado 中,所有协程都使用显式上下文切换并称为异步函数)。 协程没有线程的开销,它们还通过减少可能发生上下文切换的位置数量,使并发性更容易推理。 1234async def fetch_coroutine(url): client = AsyncHTTPClient() resp = await client.fetch(url) return resp.body 本机 <-> 装饰 coroutinesPython 3.5(或更高版本)使用 yield 或 await 来构建本机协程。使用旧版本的 Python,您可以使用装饰协程或基于收益的协程。在龙卷风中, tornado.gen.coroutine 提供它, 您可以通过以下两种方法使用协程: 1234@gen.coroutinedef fun(): data = yield fun...
2_asynchronous_and_no-blocking_IO
ASYNCHRONOUS AND NO-BLOCKING IOReal-Time web features require a long-lived mostly-idle connection per user. In a traditional synchronous web server, this implies devoting one thread to each other, which can be expensive. To minimize the cost of concurrent connections, Tornado uses a single-threaded event-loop. Thus, all application code shoule aim to be asynchronous and non-blocking because only one operation can be active as a time. BlockingA function blocks when it waits for something happe...
1_introduction
简介Tornado 是一个 Python Web 框架和异步网络库。通过使用非阻塞网络 I/O,Tornado 可以扩展到数万个开放连接,这使其成为长轮询、Websockets 和其他需要相互长期连接的应用程序的理想选择。 ##主要组成部分 网络框架包括 RequestHandler,它被子类化以创建 Web 应用程序。 HTTP 的客户端和服务器端实现HTTPServer 和 AsyncHTTPClient 异步网络库包括 IOLoop 和 IOStream 类,它们充当 HTTP 组件的构建块,也可用于实现其他协议。 协朗库类tornado.gen 允许以比链接回调更直接的方式编写异步代码。这类似于Python3.5(或更高版本,async def)中引入的原生协程功能。 其他Tornado Web 框架和 HTTP 服务器一起提供了 WSGI 上的全栈替代方案。虽然可以使用 Tornado HTTP 服务器作为其他 WSGI 框架的容器,但每种组合都有局限性,要充分利用 Tornado,您需要同时使用 Tornado 的 Web 框架和 HTTP 服务...
进程管理
进程管理进程和线程 进程概念 进程是指一个具有一定独立功能的程序在一个数据集合上的一次动态执行的过程 进程包含了一个正在运行的程序的所有状态信息:代码、数据、状态寄存器、通用寄存器和进程占用系统资源 => 进程控制块 进程是操作系统处于执行状态程序的抽象 程序 => 文件 进程 => 执行中的文件 => 程序 + 执行状态 进程的状态与转换 进程创建:系统初始化时,用户请求创建一个新的进程 或 正在运行的进程申请创建新的进程。 进程执行:内核通过调度算法选择一个就绪的进程开始执行。 进程等待:请求并等待系统服务 或 启动过某种操作,导致无法马上完成进程的等待;比如需要的数据没有到达的等待。 进程抢占:高优先级的进程就绪 或 当前执行的进程执行时间用完,被其他进程抢占。 进程唤醒:被阻塞的进程需要的资源被满足;被阻塞的进程等待的事件到达(进程只能被其他进程或者操作唤醒,不能自身唤醒) 进程结束:将进程占用的资源释放给操作系统(包括正常退出、错误退出、致命错误和被其它进程所杀等) 进程的控制与组织 进程控制块...
输入输出(IO)管理
输入输出IO管理三种常见的设备接口类型 字符设备(键盘鼠标、串口等) 块设备(磁盘、磁带、光驱等) 网络设备(以太网、无线等) IO管理概述IO控制方式 阻塞IOWait:读数据时,进程进入等待状态,直到数据读取完成;写数据时,进程进入等待状态,直到设备完成数据写入 非阻塞IODon't Wait:立即从读写系统调用返回,返回值成功传输字节数 异步IOTell me later:读数据时,使用指针标记好数据缓存区,立即返回,稍后内核将填充缓冲区并通知用户;写数据时,使用指针标记好用户缓冲区,立即返回,稍后内核将处理数据并返回给用户。 IO软件层次结构设备 -> 设备控制器 -> 设备驱动 -> IO子系统 -> 内核 IO核心子系统IO调度概念高速缓存与缓冲区 缓存:数据传输双方访问速度差距较大,引入的速度匹配中间层。磁盘缓存是磁盘扇区在内存中的缓冲区
设计模式学习笔记
创建型作用:如何创建对象 1 单例模式单例模式(Singleton)创建分为饿汉式和懒汉式,但是在开源项目中使用最多的主要有两种写法。 1.1 静态常量静态常量方式属于饿汉式,以静态变量的方式声明对象。这种单例模式在 Spring 中使用的比较多,举个例子,在 Spring 中对于 Bean 的名称生成有个类 AnnotationBeanNameGenerator 就是单例的。 1.2 双重检查机制双重检查机制(DCL)方式属于懒汉式。 123456789101112131415161718public class Singleton { private volatile static Singleton INSTANCE; private Singleton() {} public static Singleton getInstance() { if (INSTANCE == null) { synchronized (Singleton.class) {...
计算机网络概述
计算机网络概述网络的发展 计算机网络 = 计算机 + 通信 + 用户需求 计算机发展过程: 单机:单个用户独占系统资源(主机) 分时系统:分时多用户系统:多个用户利用多台终端共享单台计算机的资源 远程访问系统:利用通信线路将远程终端连接到主机,不受地域限制地使用计算机资源 网络:将多台计算机连接在一起,相互共享资源 计算机网络 以 共享资源 (硬件、软件和数据资源等)为目的而连接起来的、 在协议控制下,由一台或多台计算机、若干台终端设备、数据传输设备等组成的系统的集合。这些计算机系统应当具有能 独立自治能力 的操作系统。 计算机联网的主要目的: 资源共享: 硬件共享:大型计算机的处理能力,昂贵的外设 软件共享:应用软件、系统软件等 数据共享:用户数据等 数据传输: 支持用户之间的数据传输(如 smtp、ftp、ip 等),计算机网络可以使得分布于全球的计算机协作起来,形成一个巨大、虚拟的计算机。 网络的类型: 根据网络覆盖范围 Wide Area Network (WAN) 广域网 Local Area Network (LAN) 局域网...
计算机网络体系结构和协议
计算机网络系统结构和协议 体系结构:研究系统中各个组成成分及其关系的一门学科。 计算机网络体系结构:定义和描述一组用于计算机及其通信设施之间互连的标准和规范的集合,遵循这组规范可以很方便的实现计算机间的通信。 开放系统互连基本参考模式(OSI/RM)的设计原理 分解:将整个系统划分为若干易于实现和控制的子模块,并通过对各模块的功能、交换的数据结构和时序进行约定,协调模块之间的动作,保证系统设计的合理性和互操作性。同时可以根据各子模块的依赖关系,使用结构化的设计和实现方法,采用具有层次结构的模型与之对应。 抽象:标准的提出应当独立于实现的具体环境, OSI/RM 的确立采用了三级抽象技术。 提出 OSI/RM:建立计算机网络在概念和功能上的框架,包括确定 OSI 的层次模型,以及公共术语、属性和子模块的功能等。 提出 OSI 服务定义:在 OSI/RM 的基础上,定义各个子模块可提供的服务,即确定各个子模块的外观特性。 定义 OSI 协议规范:定义一组为确保子模块服务的提供而应遵循的规则。 子模块(层)划分的原则: 各子模块具有...
绪论
绪论O记号 问题:随着问题规模的增长,计算成本是如何变化的?考虑的是计算成本的增长趋势 分析:在问题规模足够大的情况下,计算成本如何变化: 需要执行的基本操作次数T(n) 需要占用的存储单元数量S(n),一般不考虑空间占用 对于T(n)转为O(f(n)) 常系数可以忽略,低次项可以忽略 O复杂度计算基于悲观的角度 判断代码的复杂度 常数复杂度O(1):不含转向(循环、调用、递归等),部分特例虽然含有循环、调用、递归等,但是需要考虑到实际情况才能确定。 对数复杂度O(log n):高效,复杂度无限接近常数 多项式复杂度O(n^c):界定为多项式的最高次项 线性复杂度O(n) 指数复杂度O(c^n):计算成本高 1234567void func(int n){ // n是正整数 int i = 1; while(i<=n)i*=2;}// 被嵌套的深层语句是i*=2;频率由i<=n决定,显然时间复杂度为O(log n) 冒泡排序 观察: 有序序列中,任意一对相邻元素顺序 / 无序序列中,存在一对相邻元素逆序 ...