为了简单起见,让我们假设我的服务器上只运行了一个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中,我有一个需要很长时间才能完成的代码。如何将控制返回到事件循环,以便它处理其他会话?换句话说,如何将程序设计为完全异步/并发运行会话?
库是异步的。这是否意味着库将同时处理其他连接,而我没有什么可担心的?
发布于 2022-01-19 23:55:53
在睡眠期间,uWebSockets将不处理其他网络连接。
将睡眠更改为只获取互斥、添加队列和释放互斥锁的快速代码。
创建另一个线程(我们称之为ProcessingThread),该线程获取相同的互斥对象,从队列中删除消息,释放互斥对象,并处理消息。ProcessingThread可能需要处理消息而不减慢uWebSockets线程的时间。
https://stackoverflow.com/questions/62109533
复制相似问题