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


    在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, constRequest& 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)就好。

  • 相关阅读:
    UEFI之DXE阶段
    【JVM】一文带你了解JVM中的垃圾回收机制(GC)——内含图解
    为什么机加工行业需要建设生产运营管理系统
    抛弃模板,一种Prompt Learning用于命名实体识别任务的新范式
    文献综述笔记
    dataframe应用str.contains+将多列连接成一列
    计算机毕业设计Java景区管理系统(源码+mysql数据库+系统+lw文档)
    【XTDrone Ubuntu20.04】XTDrone+ Ubuntu20.04 + PX4安装
    统计gitlab代码提交情况
    php请求库guzzlehttp/guzzle:~6.0拦截请求异常,自定义处理异常案例
  • 原文地址:https://blog.csdn.net/geejkse_seff/article/details/126326913