uWebSockets 并发会话

uWebSockets concurrent sessions

为了简单起见,假设我的服务器上只有一个uWebSockets实例运行:

struct UserData
{
   uWS::WebSocket<true, uWS::SERVER> *ws;
   bool logged_in = false;
   ID user_id; 
};
uWS::SSLApp()
          .ws<UserData>(
              "/*",
              { 
               .open =
                   [](auto *ws, auto *req) {
                     std::cout << "user with ip: " << ws->getRemoteAddress()
                               << " connected" << std::endl;
                   },
               .message =
                   [](auto *ws, std::string_view message,
                      uWS::OpCode opCode) {
                     auto userData = static_cast<UserData *>(ws->getUserData());
                     // give websocket pointer to a session
                     userData->ws = ws;
                     Session session;
                     session.process_message(userData, message);
                   } 
          .listen(9001,
                  [](auto *token) {
                    if (token)
                      std::cout << "listening on port 9001" << std::endl;
                    else
                      std::cout << "failed to listen on port 9001" << std::endl;                            
                  })
          .run();
    }); 

会话的可能实现:

class Session {
    process_message(UserData &userData, const std::string_view &message) {  
        std::this_thread::sleep_for(std::chrono::seconds(1));
    }
}

在函数 Session::process_message 中,我有一段代码需要很长时间才能完成。 我如何 return 控制事件循环以使其处理其他一些会话? 换句话说,我如何将程序设计为完全 asynchronous/run 会话并发?

库是异步的。 这是否意味着该库将同时处理其他连接而我无需担心?

休眠期间,uWebSockets不会处理其他网络连接。

将睡眠更改为仅获取互斥量、添加到队列并释放互斥量的快速代码。

创建另一个线程(让我们称之为 ProcessingThread)获取相同的互斥锁,从该队列中删除消息,释放互斥锁,并处理消息。 ProcessingThread 可能会在不减慢 uWebSockets 线程速度的情况下处理消息所需的时间。