猿问

如何取消订阅 http 处理程序?

我想创建 http 处理程序来处理一个会话:


func init(){

    http.HandleFunc("/sess/215489598", func(w http.ResponseWriter, r *http.Request) {

        //do something

    })

}

然后在会话结束(到期)时将其删除。


我怎样才能做到这一点 ?


森栏
浏览 213回答 2
2回答

慕哥9229398

这不是直接可能的:HTTP 多路复用器(ServeMux 类型)不会公开删除操作。使用 HTTP 多路复用器进行会话管理被证明是一个坏主意。HTTP 服务的当前实现有点低效。它为每个 URL 扫描整个多路复用器表,因此您拥有的处理程序越多,性能就越差。这对于一些路径来说没问题,但您无法以这种方式管理数百个会话,更不用说数十万个会话了。HTTP 多路复用器需要某种同步才能用作会话管理工具。想象一下有一个 Unhandle 方法。如果您取消处理路径,您会期望多路复用器不再使用其先前的数据处理您的路径。但是,如果没有某种同步,不同的 goroutine不能保证看到彼此对相同数据的更改。因此,HTTP 处理程序仍然可以看到多路复用器的旧视图,然后使用您认为已取消注册的处理程序响应请求。因此,HTTP 处理程序本身无法为您执行此操作 - 也不应该这样做,因为您没有任何方法来同步会话寿命。为"/sess/".创建单个处理程序。该处理程序应负责委派给各个会话。它可以使用 amap[sessionID]sessionHandler来有效地执行此操作,并且可以通过通道管理所有会话管理,让单个 goroutine 跟踪会话的创建和销毁,或者采用更传统的方法,在会话映射周围使用读写锁。这样,您可以确保在删除新请求后不会尝试将新请求分派给会话处理程序。当然,您可以随时获取 HTTP 请求,因此如果在您决定要删除会话后在指令中发生上下文切换,则有人可能会在您锁定地图以删除会话之前的那一刻跳入并连接到会话锁定地图,但在您实际操作之前,因此请谨慎管理您的锁定和会话策略。在这里做的“正确的事情”主要取决于您的个人应用程序的需求。
随时随地看视频慕课网APP

相关分类

Go
我要回答