1

为简单起见,假设我的服务器上运行了一个 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,我有一个需要很长时间才能完成的代码。如何将控制权返回给事件循环以使其处理其他一些会话?换句话说,我如何将程序设计为完全异步/同时运行会话?

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

4

1 回答 1

1

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

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

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

于 2022-01-19T23:55:53.283 回答