CERL2 系列2:网络编程该用同步还是异步?

原创 2010年01月12日 01:18:00

在C/C++中,libevent、boost asio 这两个网络库都采用异步编程模型,当IO完成事件发生时,调用一个回调函数处理它。这种编程模型有很好的IO吞吐量。但是付出的代价也很大:

  1. 丑陋的代码。应用程序逻辑被一个个回调函数切割得支离破碎。
  2. 复杂的内存管理。一个不小心,就有可能出现回调函数执行的时候,相应的内存已经被释放。
  3. 调试困难。由于函数被切割,Debug的时候,代码执行顺序不能很好地保持思维的连贯。

Erlang 语言很好地解决了这个问题。正是它引入了“轻量级进程”这个解决方案。这个解决方案的观念很质朴:单个进程采用同步调用,而用足够多的进程来使得IO并行化,提高IO吞吐量。

 

其实,类似的观念并不是Erlang首先提出的。我们想想操作系统。单个进程(或线程)采用同步IO(read/write)。要同时做多个IO操作?创建新进程(或线程)来做这件事情。

 

所以,Erlang 真正的创举在于“进程”的“轻量级”。只有进程轻量级了,才可以无所顾忌地创建进程。而IO并行化才得以实施。

 

所以,我推崇 Erlang 语言,最根本的一点,在于它告诉大家,高性能的网络服务器的代码也可以是很简单、很优雅的。

 

CERL2 继承了 Erlang 或者 操作系统的这个哲学。我们举个例子:

 

假设我们已经实现了一个向单个服务器的rpc代码:

 

void call(Result& result, const Host& host, const Request& req);

 

此为向 host 发送 req 请求,返回 result。

 

如果我们希望同时向多个服务器发送同一个请求,这个在网络编程中称为 multi_call。原型如下:

 

void multi_call(Result results[], const Host hosts[], size_t n, const Request& req);

 

在 CERL2 中要实现该功能,你无须修改call的代码。简单用 n 个纤程分别来做一个单独的 call 即可。

 

所以,CERL2 编程是很简单的,因为你一直以来就用这种方式在思考,不是吗?

 

最后我们重复一下 CERL2 编程哲学中最重要的原则:

在 CERL2 中,只有同步调用。要想使 IO 并行,用多个纤程(Fiber)就好。

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

C#网络编程(同步传输字符串) - Part.2

服务端客户端通信 在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可以在客户端与服务端之...

C#网络编程(同步传输字符串) - Part.2

服务端客户端通信在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可以在客户端与服务端之间传...

C#网络编程(同步传输字符串) - Part.2

C#网络编程(同步传输字符串) - Part.2 服务端客户端通信 在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几...

网络编程(2)Socket同步非阻塞工作模式

同步非阻塞模式比前面说的那个同步阻塞模式要高些,虽然高得有限.在这种模式下,send或recv函数会设为MSG_DONTWAIT, 即非阻塞,即便没有值,就略过继续做后面的事。比如有多个socket时...

C#网络编程(同步传输字符串) - Part.2

服务端客户端通信 在与服务端的连接建立以后,我们就可以通过此连接来发送和接收数据。端口与端口之间以流(Stream)的形式传输数据,因为几乎任何对象都可以保存到流中,所以实际上可以在客户端与服务端之...

网络编程基础(2) : 同步非阻塞

1. 簡介 在"网络编程基础(1)"中提到过了同步与非阻塞的观念,现在我们将这两者作结合讨论~ 同步非阻塞I/O调用发起后,调用会得到内核返回的状态值,因此,在内核得到数据之前都不会被阻塞住, 会阻塞...

C#网络编程(同步传输字符串) - part.2

源地址:http://www.tracefact.net/CSharp-Programming/Network-Programming-Part2.aspx 服务端客户端通信 在与服务端的...

socket网络编程中的同步,异步,阻塞式,非阻塞式,有何联系与区别

在进行网络编程时,我们常常见到同步、异步、阻塞和非阻塞四种调用方式。这些方式彼此概念并不好理解。下面是我对这些术语的理解。 同步   所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调用...

【网络编程】半同步--半异步线程池源码分析之线程池(基于C++11)

前言上一篇博客中,我们分析了对于一个线程池中任务队列实现,本文则是对线程池源码分析和一个实例的使用。 正文const int MaxTaskCount = 100; //任务队列中保存最大任务数,使用...

网络编程中的异步、同步、阻塞、非阻塞

关于网络编程中的异步、同步、阻塞、非阻塞的理解 1、异步和同步为一组对应概念。(我们讨论同步异步,都特指那些需要其他部件协作或者需要一定时间完成的任务,因为很快完成的任务无所谓同步和异步) ...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)