OSI (Open System Interconnect, 开放系统互连参考模型)为开放式互连信息系统提供了一种理论上的网络模型,而 TCP/IP 则是实际实现运行的网络模型。TCP/IP 采用四层结构,它与 OSI 七层结构的对应关系如下图所示:
注:上述协议分层不是完美的,ICMP/IGMP 作为 IP 的附属协议,其数据是封装在 IP 数据包中的,所以在逻辑上它们是在 IP 的上层,这个在后面数据分用的示意图中会体现;ARP/RARP 也遇到同样的问题,它们与 IP 数据报一样都有各自的以太网帧结构,但又是为 IP 地址转换服务的,所以在逻辑上它们是在 IP 的下层。在《TCP-IP详解》中就将 ARP/RARP 划分到网络接口层。在这个图中,将这几个协议都放在与 IP 同一层只是为了选择一种分类方式,不是绝对的。
with StackContext(die_on_error): # Any exception thrown here *or in callback and its desendents* # will cause the process to exit instead of spinning endlessly # in the ioloop. http_client.fetch(url, callback) ioloop.start()
All the signal numbers are defined symbolically. For example, the hangup signal is defined as signal.SIGHUP; the variable names are identical to the names used in C programs, as found in . The Unix man page for ‘signal()‘ lists the existing signals (on some systems this is signal(2), on others the list is in signal(7)). Note that not all systems define the same set of signal names; only those names defined by the system are defined by this module. (注:每一个信号名称是有一个代表正整数的宏来表示,但是不应该试图去推测宏代表的具体数字,而是直接使用信号名称。这是因为这个数字会随着系统的不同或同一系统的不同版本而不同,但是名称还算是标准化和统一的)
在C#4.0之前方法都是单一分派的,C#4.0增加了“动态类型”,因为dynamic类型运行时才能确定类型,所以会参与方法分派。也就是说,如果一个虚方法调用的参数的类型是都是dynamic(如果有静态类型参数,那么静态类型参数将不参与方法分派,而是在编译期参与方法推断:This means that for all arguments not statically typed dynamic, the compile time types will be used, regardless of their runtime types.),那么整个方法调用都无法在编译时判定到底应该选用哪个具体版本。CLR会根据方法接收者(this)和每个参数的实际类型来进行方法分派,这个语义与多分派的语义是相同的。如下代码所示:
从定义上可以看出,这两种对闭包的定义具有完全不同的关注点。对于第一种定义,强调的是闭包是函数,是一类特殊的函数。第二种定义认为闭包是函数和引用环境组成的实体,本质上不再是函数,而是函数对象,能够作为对象使用的函数。术语 first class function 是对这个概念的精确描述。函数本质上只是一些可执行的代码,一旦被定义好以后就不会发生变化,没有状态,具有引用的透明性。闭包作为函数对象,可以由同一个函数与不同的引用环境组成不同的实例,有状态,没有引用的透明性,所以闭包不再是单纯的函数。
IOLoop在Linux下使用epoll, 在BSD/Mac OS X下使用kqueue,否则使用selelct。
1 2 3 4 5 6 7 8 9 10 11
@classmethod defconfigurable_default(cls): if hasattr(select, "epoll"): from tornado.platform.epoll import EPollIOLoop return EPollIOLoop if hasattr(select, "kqueue"): # Python 2.6+ on BSD or Mac from tornado.platform.kqueue import KQueueIOLoop return KQueueIOLoop from tornado.platform.select import SelectIOLoop return SelectIOLoop
defadd_handler(self, fd, handler, events): """Registers the given handler to receive the given events for ``fd``. The ``fd`` argument may either be an integer file descriptor or a file-like object with a ``fileno()`` method (and optionally a ``close()`` method, which may be called when the `IOLoop` is shut down). The ``events`` argument is a bitwise or of the constants ``IOLoop.READ``, ``IOLoop.WRITE``, and ``IOLoop.ERROR``. When an event occurs, ``handler(fd, events)`` will be run. .. versionchanged:: 4.0 Added the ability to pass file-like objects in addition to raw file descriptors. """