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 线程速度的情况下处理消息所需的时间。
为了简单起见,假设我的服务器上只有一个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 线程速度的情况下处理消息所需的时间。