【问题标题】:Why does hyper require Handler to implement Sync instead of using independent Handlers per thread?为什么 hyper 要求 Handler 实现 Sync 而不是每个线程使用独立的 Handler?
【发布时间】:2016-10-15 23:38:06
【问题描述】:

Hyper 具有以下 exampleHandler 实现 Sync

use std::sync::Mutex;
use std::sync::mpsc::{channel, Sender};
use hyper::server::{Handler, Server, Request, Response};

struct SenderHandler {
    sender: Mutex<Sender<&'static str>>
}

impl Handler for SenderHandler {
    fn handle(&self, req: Request, res: Response) {
        self.sender.lock().unwrap().send("start").unwrap();
    }
}

并声明Handler 必须实现Sync,因为Handler 可以从不同的线程中调用。

对我来说,这听起来像是不必要的性能损失。我更愿意为每个线程设置一个SenderHandler,每个线程都是独立的,这样就不需要实现Sync

我是否误解了 Hyper,Rust 的类型系统,或者这不可能?

【问题讨论】:

  • 在提供的示例中,我很想删除保护SenderMutex,因为Sender 已经为无锁线程内消息传递而设计。它只需要每个线程一个clone
  • 经过几分钟的思考,我倾向于同意你的看法。克隆处理程序会更强大,因为您还可以通过在处理程序中使用单个 Arc&lt;OldBehaviorHandler&gt; 来模拟旧行为。反过来就没那么容易了……(据我现在所见)

标签: multithreading rust hyper


【解决方案1】:

这是剪纸问题。

Sync 对于任何无状态处理程序都可以轻松实现;相反,拥有Clone 绑定意味着多个并发状态彼此独立发展(请求被随机分派)。我什至不确定是否可以保证在处理请求期间等待同一个线程会被调用并得到结果。

通过使用Sync,作者迫使您思考跨查询(甚至查询内)共享状态意味着什么。


在提供的示例中,我很想删除保护 Sender 的 Mutex,因为 Sender 已经为无锁线程内消息传递而设计。它所需要的只是每个线程的一个克隆。

您可以让Sender 实现Sync(如果是)(显然要考虑清楚),然后删除Mutex

虽然不太优雅,但也可以使用 thread_local! 宏为每个线程创建一个实例,然后在调用时蹦床处理程序将工作分派给线程本地 Sender


最后,请注意 hyper 目前正在重新设计中;它应该移至Future,这可能会或可能不会引起这里的重新考虑。

【讨论】:

  • 谢谢你,我不知道不同的线程可能会处理一个请求的各个部分,这总是正确的还是遵循 hyper 的设计?
  • 另外,我如何让Sender 实现Sync,这意味着什么?我认为Sender 的设计本身就禁止Sync 并强制用户克隆。
  • @PureW:哪个Sender?我认为这是您代码中的一种类型(因为没有限定),如果不是,那么您无法为其实现Sync。如果是,那么你可以为它实现Sync,使用unsafe,如果你知道你在做什么;你可能想在 reddit、用户论坛或 IRC 上提问,但如果这一切对你来说都是陌生的。
  • 对不起,Sendermpsc 中的那个。完整的例子有一个use std::sync::mpsc::Sender;
【解决方案2】:

好的,所以目前这在 Hyper 中似乎是不可能的。在issue 248 中进行了讨论,开发人员更喜欢Sync 而不是Clone

我们在 IRC 上讨论过这个问题。简单的概要是,如果它是 Clone,用户可以很容易地在他们的处理程序上拥有他们认为的状态 每次请求都会修改,但相反,它会被克隆 几次,而不是修改他们希望的内容。反而更好 强制用户确保他们的状态是同步的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-28
    • 2011-10-01
    • 1970-01-01
    • 2015-09-29
    • 2012-05-31
    • 1970-01-01
    • 2021-09-12
    相关资源
    最近更新 更多