【发布时间】:2021-10-22 10:23:20
【问题描述】:
问题 - 如果您有一个系统但有多个仲裁器在运行,它仍然是一个单线程事件循环吗?
阅读 Actix 书籍 - https://actix.rs/book/actix/sec-6-sync-arbiter.html
当您正常运行 Actor 时,系统的仲裁线程上会运行多个 Actor,使用其事件循环
还有来自https://actix.rs/book/actix/sec-5-arbiter.html
虽然它只使用一个线程,但它使用了非常有效的事件循环模式,该模式非常适用于异步事件。要处理同步的、受 CPU 限制的任务,最好避免阻塞事件循环,而是将计算卸载到其他线程。对于这个用例,请阅读下一部分并考虑使用 SyncArbiter。
问题重复 - 如果您有一个系统,但其中有多个仲裁器在运行,它仍然是一个单线程事件循环吗?
例子
let sys = System::new();
sys.block_on( async move {
let arbiter1 = Arbiter::new(); // one arbiter here
arbiter1.spawn( SOME ACTOR);
let arbiter2 = Arbiter::new(); // another arbiter here
arbiter2.spanw( SOME OTHER ACTOR);
});
sys.run().unwrap();
这是否在单个线程中运行?
当我使用 log4rs 记录它时,我看到以下内容
[actix-rt|system:0|arbiter:0]
[actix-rt|system:0|arbiter:1]
鉴于它是 system:0 - 这是否意味着它只是使用不同的仲裁器是同一个线程?
我需要运行多个System::new 才能在actix 中实现正确的多线程吗?
【问题讨论】:
-
我也有同样的困境。您是否设法确定它是否是多线程的?