deferred Transports Protocols 简单介绍

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Twisted架构概览

Twisted是一个事件驱动型的网络引擎。由于事件驱动编程模型在Twisted的设计哲学中占有重要的地位,因此这里有必要花点时间来回顾一下究竟事件驱动意味着什么。

事件驱动编程是一种编程范式,这里程序的执行流由外部事件来决定。它的特点是包含一个事件循环,当外部事件发生时使用回调机制来触发相应的处理。另外两种常见的编程范式是(单线程)同步以及多线程编程。

让我们用例子来比较和对比一下单线程、多线程以及事件驱动编程模型。图21.1展示了随着时间的推移,这三种模式下程序所做的工作。这个程序有3个任务需要完成,每个任务都在等待I/O操作时阻塞自身。阻塞在I/O操作上所花费的时间已经用灰色框标示出来了。

22165355_EDv6.png

图21.1 线程模型

在单线程同步模型中,任务按照顺序执行。如果某个任务因为I/O而阻塞,其他所有的任务都必须等待,直到它完成之后它们才能依次执行。这种明确的执行顺序和串行化处理的行为是很容易推断得出的。如果任务之间并没有互相依赖的关系,但仍然需要互相等待的话这就使得程序不必要的降低了运行速度。

在多线程版本中,这3个任务分别在独立的线程中执行。这些线程由操作系统来管理,在多处理器系统上可以并行处理,或者在单处理器系统上交错执行。这使得当某个线程阻塞在某个资源的同时其他线程得以继续执行。与完成类似功能的同步程序相比,这种方式更有效率,但程序员必须写代码来保护共享资源,防止其被多个线程同时访问。多线程程序更加难以推断,因为这类程序不得不通过线程同步机制如锁、可重入函数、线程局部存储或者其他机制来处理线程安全问题,如果实现不当就会导致出现微妙且令人痛不欲生的bug。

在事件驱动版本的程序中,3个任务交错执行,但仍然在一个单独的线程控制中。当处理I/O或者其他昂贵的操作时,注册一个回调到事件循环中,然后当I/O操作完成时继续执行。回调描述了该如何处理某个事件。事件循环轮询所有的事件,当事件到来时将它们分配给等待处理事件的回调函数。这种方式让程序尽可能的得以执行而不需要用到额外的线程。事件驱动型程序比多线程程序更容易推断出行为,因为程序员不需要关心线程安全问题。

当我们面对如下的环境时,事件驱动模型通常是一个好的选择:

  1. 程序中有许多任务,而且…

  2. 任务之间高度独立(因此它们不需要互相通信,或者等待彼此)而且…

  3. 在等待事件到来时,某些任务会阻塞。

当应用程序需要在任务间共享可变的数据时,这也是一个不错的选择,因为这里不需要采用同步处理。

网络应用程序通常都有上述这些特点,这使得它们能够很好的契合事件驱动编程模型。



Transports

Transports代表网络中两个通信结点之间的连接。Transports负责描述连接的细节,比如连接是面向流式的还是面向数据报的,流控以及可靠性。TCP、UDP和Unix套接字可作为transports的例子。它们被设计为“满足最小功能单元,同时具有最大程度的可复用性”,而且从协议实现中分离出来,这让许多协议可以采用相同类型的传输。Transports实现了ITransports接口,它包含如下的方法:

write                   以非阻塞的方式按顺序依次将数据写到物理连接上
writeSequence           将一个字符串列表写到物理连接上
loseConnection          将所有挂起的数据写入,然后关闭连接
getPeer                 取得连接中对端的地址信息
getHost                 取得连接中本端的地址信息

将transports从协议中分离出来也使得对这两个层次的测试变得更加简单。可以通过简单地写入一个字符串来模拟传输,用这种方式来检查。

Protocols

Protocols描述了如何以异步的方式处理网络中的事件。HTTP、DNS以及IMAP是应用层协议中的例子。Protocols实现了IProtocol接口,它包含如下的方法:

makeConnection               在transport对象和服务器之间建立一条连接
connectionMade               连接建立起来后调用
dataReceived                 接收数据时调用
connectionLost               关闭连接时调用


转载于:https://my.oschina.net/u/1458120/blog/549118

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/399156.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java web 请求跟踪_IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术

原标题:IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie技术Cookie使用HTTPHeader传递数据。Cookie机制定义了两种报头,Set-Cookie报头和Cookie报头。Set-Cookie报头包含于Web服务器的响应头(ResponseHeader)中,Cookie报头包含在浏览器客户端请…

FAT和EXFAT文件系统

源:FAT和EXFAT文件系统转载于:https://www.cnblogs.com/LittleTiger/p/8022450.html

关于easyUI在子页面增加显示tabs的一个问题

关于easyUI在子 在父页面点个链接能动态看到子页面的情况太简单,请看easyUI官网:http://www.jeasyui.com/tutorial/layout/tabs2.php 现在说的是在子页面点个按钮也能触发增加子页面的情况。 情景是,在父页面上有个div如: Html代…

java 两个窗口 贴_粘贴子窗体中的多个记录时的子窗体校准错误

我对子窗体上的所有三个事件进行计算以更新主窗体:Private Sub Form_AfterDelConfirm(Status As Integer)Me.Parent.UpdateStundenEnd SubPrivate Sub Form_AfterInsert()Me.Parent.UpdateStundenEnd SubPrivate Sub Form_AfterUpdate()Me.Parent.UpdateStundenEnd …

SDN第二次上机作业

1、安装floodlight 2、生成拓扑并连接控制器floodlight,利用控制器floodlight查看图形拓扑 3、利用字符界面下发流表,使得‘h1’和‘h2’ ping 不通 4、利用字符界面下发流表,通过测试‘h1’和‘h3’的联通性,来验证openflow的har…

Android保存图片到本地相册

好久没有写东西了。备份下知识吧。免得忘记了 。 首先贴一段代码 -- 这个是先生成一个本地的路径,将图片保存到这个文件中,然后扫描下sd卡。让系统相册重新加载下 。缺点就是只能保存到DCIM的文 件夹下边,暂时不知道怎…

PHP的钩子实现解析

2019独角兽企业重金招聘Python工程师标准>>> 钩子是编程里一个常见概念,非常的重要。它使得系统变得非常容易拓展,(而不用理解其内部的实现机理,这样可以减少很多工作量)。只要有一个钩子样本,能…

writer在java中的意思_Java在FileWriter和BufferedWriter之间的区别

小编典典如果您使用BufferedWriter则效率更高在刷新/关闭之间有多次写入与缓冲区大小相比,写操作较小。在您的示例中,您只有一次写入,因此BufferedWriter只会增加您不需要的开销。这是否意味着第一个示例一个接一个地写入字符,第二…

Ubuntu配置静态IP

进入 /etc/network/interfaces,修改成如下: # interfaces(5) file used by ifup(8) and ifdown(8)auto loiface lo inet loopbackauto ens33iface ens33 inet staticaddress 192.168.1.110netmask 255.255.255.0gateway 192.168.1.1dns-nameserver 8.8.8…

tiny xml 使用总结

这几天在埋头写自己的3D文件浏览器(稍后发布),突发奇想的要把自己的内部格式转化成XML,于是,把以前在研究所时用过的ExPat翻了出来。ExPat是基于事件的XML解释器,速度挺快的,但结构方面有点不敢…

Beta冲刺! Day2 - 砍柴

Beta冲刺! Day2 - 砍柴 今日已完成 晨瑶:大致确定了文章推荐的算法思路(Content-based recommender);理清了不少feature的事宜昭锡:修复了日期选择越界时导致程序崩溃和点击光点返回后,日期选择…

Android版添加phonegap--websocket客户端插件教程

2019独角兽企业重金招聘Python工程师标准>>> 1.在Eclipse中新建Android Project项目chatdemo2.把animesh kumar的websocket-android-phonegap项目java文件打成phonegap-websocket-support.jar包,存放在 android project的libs目录下3.把websocket.js存放…

java参数传入的是一个类名_Java编程细节——泛型的定义(类、接口、对象)、使用、继承...

1. 设计泛型的初衷:1) 主要是为了解决Java容器无法记忆元素类型的问题:i. 由于Java设计之初并不知道会往容器中存放什么类型的元素,因此元素类型都设定为Object,这样就什么东西都能放了!ii. 但是这样设计有明显的缺点&…

ExtJS Grid Column Number

{xtype: numbercolumn,text: 亏盈数量,width: 130,dataIndex: LossOrProfitNum,editor: {xtype: numberfield,minValue: 0,decimalPrecision: 2},renderer: function (value, cellmeta) {return Ext.util.Format.number(value, 0.00);}}转载于:https://www.cnblogs.com/denghua…

#define | enum(enumerator)

/***************************************************************************** #define | enum(enumerator)* 声明:* 今天突然在Linux内核看到枚举和宏,感觉是一样的功能,于是找了一下他们* 之间差异。** …

网页制作中如何自定义网页图标

第一步,准备一个图标制作软件。 首先您必须了解所谓的图标(Icon)是一种特殊的图形文件格式,它是以.ico 作为扩展名。普通的图像设计软件无法使用这种格式,所以您需要到下载一个ico图标工具,本站常用软件既有,推荐强大…

ext 解析后台返回response.responseText中的数据

Ext.Ajax.request({ url: "...", method: "POST", params: { currentID: mainNode.attributes.id }, success: function (response) { var resp Ext.decode(response.responseText ); resp.totalCount; } }); //ajax over //响应中返回的resp…

java资源争夺_所有满足类似需求,争夺同类资源的组织和个人统称为(   )。...

【判断题】重合断面的轮廓线用细实线绘制。【单选题】阿萨德法师法啥【单选题】三相桥式交叉连接电路为限制脉动环流需要( )平衡电抗器【单选题】地方搞活动风格化大发光火【填空题】若s是int型变量,且s6,则表达式s%2(s1)%2的值为________。【填空题】负反馈的作用是( )。【单选…

Linux环境下安装部署AWStats日志分析系统实例

AWStats是使用Perl语言开发的一款开放性日志分析系统,可分析Apache网站服务器的访问日志,还可以用来分析Samba、Vsftpd、IIS等日志信息。此文章主要讲解如何在linux系统下安装部署关于对Apache网站服务站日志分析的AWStats。实验步骤一,安装部…

HDU4911 Inversion 解题报告

题意&#xff1a;求逆序对 解题思路&#xff1a;1)树状数组 离散化 解题代码&#xff1a; 1 // File Name: a.cpp2 // Author: darkdream3 // Created Time: 2014年08月05日 星期二 12时05分09秒4 5 #include<vector>6 #include<list>7 #include<map>8 #inc…