1. 阻塞/非阻塞
对于网络编程而言,Socket模式是开发者必须明确的一个问题。对于Socket的操作,可以分为阻塞模式和非阻塞模式两种。在两种不同模式下,同一个Socket函数的表现可能完全不同,所以必须引起开发者的注意。在解释阻塞(blocking)和非阻塞(non-blocking)之前,先看另外一对相对的词语,"同步"(synchronous)和"异步"(asynchronous)。同步和异步指的是两个模块间的消息交互方式。在程序中,模块之间的所有关系都是通过不同的函数去体现的。我们知道所有的函数都可以存在返回值,如果模块A调用模块B的f()函数时,得到的参数返回值能够代表业务上所需要的结果,则可以称此函数f()为同步函数,模块A和模块B就此消息流程的过程是同步的。否则则称为异步。
上面的解释太过于绕口令了,举个简单的例子:
模块A为应用界面,模块B为网络通讯模块,A通过B同远端的模块C进行实时通讯。模块B存在接口函数f(),函数f()能够保证网络通讯的数据完整性和正确性,并通过返回值bool量来表示成功失败(成功表示C端接收到完整的模块B所发送的数据,而失败则相反)。如果模块A调用模块B的f()函数的目的,只是为了把数据发送到C端,则在此情况下,我们可以把f()函数所代表的动作看作是一个同步动作。而如果模块A通过模块B的f()函数发送的数据具有某种实际意义,模块A期望的是得到所发送数据的真实响应结果,如A发送的数据是用来操作C促发某个动作,如操作一个数据库,或者前端的某个机械部件,A希望得到此动作的一个结果。则模块B提供的f()函数就不能被看作是一个同步的接口,因为f()函数的返回值只表示网络数据发送的成功与失败。如果A需要得到真实的操作结果,必须对B进行其他调用。A发送消息并得到其想要的对应结果的过程被分割成了两个部分,因此可以被看作是一个异步过程。
抛开上面的同步和异步,跑的更远一些。我们都知道编程当中,在对现实世界的业务组织上,模块的思想是非常重要的,每一模块都只专注于自己需要实现的事情,彼此之间互不影响,模块之间通过有限的接口来实现互动。通过对模块的合理规划,可以使代码具有更好的组织性和维护性。
同时我们也知道,在计算机所提供实现编程方式里,能够使用的技术只有函数调用ÿ