要并行处理 Actix WebSocket 请求,我们可以使用 Actix 中提供的 WebSocketActor。WebSocketActor 可以在 WebSocket 连接期间管理生命周期,并提供消息处理的所有必要实现。在标准 ActixHTTP 句柄中,请求是同步处理的。这意味着,直到将请求处理完毕并返回响应之前,该请求将会阻塞进程并且无法接受其他请求。为了处理并发请求,我们可以使用 ActixHTTP 服务器中的线程池。
下面是一个使用线程池和 WebSocketActor 来并发处理 WebSocket 请求的示例代码:
use actix_web::{web, Error, HttpRequest, HttpResponse};
use actix_web_actors::ws;
use futures::{Future, Stream};
fn index(r: HttpRequest, stream: web::Payload) -> Result {
ws::start(MyWebSocket::new(), &r, stream)
}
struct MyWebSocket {
// ...
}
impl MyWebSocket {
fn new() -> MyWebSocket {
MyWebSocket {
// ...
}
}
}
impl Actor for MyWebSocket {
type Context = ws::WebsocketContext;
}
impl StreamHandler for MyWebSocket {
fn handle(&mut self, msg: ws::Message, ctx: &mut Self::Context) {
// ...
}
}
/// Server definition
fn main() {
HttpServer::new(|| {
App::new()
.resource("/", |r| r.method(Method::GET).with(index))
})
.bind("127.0.0.1:8080")
.unwrap()
.start();
}
在该示例中,我们在 index
方法中创建了一个新的 WebSocketActor 来处理每个 WebSocket 连接。将流传递到 ws::start
方法中,以便在 WebSocket 连接开始时立即启动 WebSocketActor。
在 WebSocketActor 中,我们实现了 StreamHandler
,以处理每个传入的