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)就好。

 

浅谈android中的异步加载一

1、为什么需要异步加载。     因为我们都知道在Android中的是单线程模型,不允许其他的子线程来更新UI,只允许UI线程(主线程更新UI),否则会多个线程都去更新UI会造成UI的一个混乱有些耗时...
  • u013064109
  • u013064109
  • 2016年06月02日 19:32
  • 6489

Retrofit2的再封装实战—同步与异步请求

前言 首先这篇文章是面向对Retrofit有了解的朋友,如果您对Retrofit并不了解,请自行查阅其用法,本文不会讲解Retrofit的基础用法。 写这篇文章的目的很简单: 1.为了让自己...
  • liner666
  • liner666
  • 2017年02月06日 10:17
  • 892

怎么样理解同步清零和异步清零?

DA专业论坛 » 通用设计 » [求助] 大家是怎么样理解同步清零和异步清零的??查看完整版本: [求助] 大家是怎么样理解同步清零和异步清零的?? mxflying 2005-4-20 0...
  • pianistOfSoftware
  • pianistOfSoftware
  • 2016年07月20日 15:52
  • 2894

同步和异步,区别

同步: 同步的思想是:所有的操作都做完,才返回给用户。这样用户在线等待的时间太长,给用户一种卡死了的感觉(就是系统迁移中,点击了迁移,界面就不动了,但是程序还在执行,卡死了的感觉)。这种情况下,用户不...
  • Ideality_hunter
  • Ideality_hunter
  • 2016年12月04日 11:20
  • 6679

程序同步与异步的区别

同步是指:发送方发出数据后,等接收方发回响应以后才发下一个数据包的通讯方式。   异步是指:发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式。   ---------------...
  • jk110333
  • jk110333
  • 2013年05月28日 11:04
  • 14742

同步串口和异步串口的区别及使用情况

在计算机系统中,CPU和外部通信有两种通信方式:并行通信和串行通信。而按照串行数据的时钟控制方式,串行通信又可分为同步通信和异步通信两种方式。   1、异步串行方式的特点   所谓异步通信,是指数...
  • seashine_yan
  • seashine_yan
  • 2017年05月05日 10:56
  • 3211

js中的同步和异步的个人理解

你应该知道,javascript语言是一门“单线程”的语言,不像java语言,类继承Thread再来个thread.start就可以开辟一个线程,所以,javascript就像一条流水线,仅仅是一条流...
  • qq_22855325
  • qq_22855325
  • 2017年06月09日 15:09
  • 5978

node.js 同步和异步

Node.js运行在单一进程并实现了异步编码的风格
  • u014773478
  • u014773478
  • 2014年09月28日 15:58
  • 1457

同步和异步的区别

答案一: 1.异步传输  通常,异步传输是以字符为传输单位,每个字符都要附加 1 位起始位和 1 位停止位,以标记一个字符的开始和结束,并以此实现数据传输同步。所谓异步传输是指字符与字符(一个...
  • xjbclz
  • xjbclz
  • 2016年07月14日 20:39
  • 1558

通俗理解同步通信与异步通信

网络上对同步传输与异步传输的文章一大把,各种图示解说也很多,但看完终归有点一头雾水,本文通俗的来说说这两种通信方式。...
  • RhythmWANG
  • RhythmWANG
  • 2017年03月29日 16:35
  • 927
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CERL2 系列2:网络编程该用同步还是异步?
举报原因:
原因补充:

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