2017-08-09 88 views
-2

同事!Golang http.HandleFunc:处理查询

实施例的代码是标准:

func echo(w http.ResponseWriter, r *http.Request) { 
    c, _ := upgrader.Upgrade(w, r, nil) 
    defer c.Close() 
    for {  
     _, message, _ := c.ReadMessage() 
     log.Printf("recv: %s", message) 
     if string(message) == "qwerty"{ 
      func(){ 
       fmt.Println("in func 1") 
       time.Sleep(time.Second * 10) // here method performs some work 
      }() 
     } 
     if string(message) == "asdfg"{ 
      func(){ 
       fmt.Println("in func 2") 
       time.Sleep(time.Second * 10) // here method performs some work 
      }() 
     } 

    } 
} 

func main() { 

    http.HandleFunc("/echo", echo) 
    log.Println("Socket waiting connection on * : 3000") 
    log.Fatal(http.ListenAndServe(":3000", nil)) 

} 

我有这样的麻烦。 我的应用程序不是用户的多任务处理。用户必须请求方法并在系统繁忙时等待。但是,虽然被调用的方法仍在工作,但如果同一个客户端调用另一个方法,服务器会缓存其请求,方法2将在前一个方法完成后立即启动。但是,我需要应用程序中的另一个行为:如果任何方法性能未完成,则客户端必须收到消息,以前的查询仍在进行中,并且必须删除他的新查询。如何修改echo func以防止多任务?只有一个请求调用函数。如果任何功能仍然有效,则另一个请求将随着消息发送给客户端以稍后尝试。

+3

你必须做你所描述的。没有内置的方法来做到这一点 - 甚至没有内置的方法来确定它是否是相同的用户。尝试实施,如果遇到问题,请发布有关该问题的问题。 – Adrian

回答

0

首先,你有一个无限循环没有任何中断子句。

如果没有来自会话或cookie管理的帮助,您无法阻止客户端向您的服务器发送后续请求。我会做的是当客户端访问您的服务器时为客户端分配Cookie,并创建访问其他资源所需的Cookie。客户端成功发送请求后,更新cookie中的数据以反映当前客户端具有在后台运行的进程。您可能还需要在服务器端进行一些会话管理,因为客户端可能会清除Cookie。