zoukankan      html  css  js  c++  java
  • 半同步半异步高性能网络编程

    网络编程的模式分为3种:

    1. nginx的全异步方式,使用epoll处理网络数据。对于请求的处理也全然是异步的。

    不论什么一个请求的处理假设花费了较长时间,那么nginx进程就会被处理操作堵塞,导致无法处理IO事件

    2. 简单的一个连接一个线程方案。这样的方案无法处理大量并发的连接。适用mysql这类连接数不多的场景。当中也有一些优化的做法,比如使用线程池避免不断的创建销毁线程。

    3. 半同步半异步方式,启动一个IO线程使用epoll处理网络数据。

    当收到一个完整的请求包,把请求放到任务队列。有一个线程池不断的从队列里获取任务,同步处理,处理完之后再把响应数据由IO线程返回给用户。


    当中半同步半异步方式广泛应用于server端编程。比如taobao开源的tbnet(tair,tfs都使用该库)。主要原因是nginx的全异步方式编敲代码难度高,开发效率低,而一个连接一个线程方案无法支持大量的并发连接。半同步半异步方式则是开发效率与高性能之间的一个权衡。网络处理等有框架进行处理。开发人员仅仅关注业务逻辑的编写,仅仅需同步处理请求就可以,对于须要訪问mysql等的应用很方便。


    对于tbnet这类的半同步半异步的网络库,使用者须要对多个类进行继承,override相关的handler来处理,一个很easy的样例须要不少代码。

    c++11标准出来之后,处理函数能够用匿名函数优雅的解决。handy是一个使用最新的c++11来简化网络编程的库,里面的样例很简洁。

    使用handy库进行半同步半异步编程的样例例如以下:

    #include <handy/handy.h>
    
    using namespace std;
    using namespace handy;
    
    int main(int argc, const char* argv[]) {
        EventBase base;
        HSHA hsha(&base, 4);
        int r = hsha.bind("", 99);
        exitif(r, "bind failed");
        Signal::signal(SIGINT, [&]{ base.exit(); hsha.exit(); signal(SIGINT, SIG_DFL);});
    
        hsha.onMsg(new LineCodec, [](const TcpConnPtr& con, const string& input){
            int ms = rand() % 1000;
            info("processing a msg");
            usleep(ms * 1000);
            return util::format("%s used %d ms", input.c_str(), ms);
        });
        base.loop();
        info("program exited");
    }
    当中hsha.onMsg调用指定怎样处理消息。第一个參数指定怎样对消息进行编解码。这里传入的是一个行解码器,适用于telnet中的应用。第二个參数是个回调函数,指定怎样处理消息。

    回调函数第一个參数为连接指针,第二个參数为消息。

    返回值为string。即消息的响应。

    HSHA hsha(&base, 4) 创建一个半同步半异步server,线程池中线程数量为4.


    这个样例的完整版本号见:https://github.com/yedf/handy/blob/master/examples/hsha.cc
  • 相关阅读:
    03、CPU主频,和性能
    02、计算机组成原理相关知识
    常用正则表达式,手机号、固话号、身份证号等
    01、计算机原理结构,及冯诺依曼体系结构
    7-7 Complete Binary Search Tree (30分) 完全二叉搜索树
    7-2 Reversing Linked List (25分)
    7-1 Maximum Subsequence Sum (25分)
    6-17 Shortest Path [4] (25分)
    6-16 Shortest Path [3] (25分)
    6-15 Iterative Mergesort (25分)
  • 原文地址:https://www.cnblogs.com/clnchanpin/p/6766888.html
Copyright © 2011-2022 走看看