2017-08-09 7 views
-2

同僚!私は、このような悩みを持っているゴラン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は前のメソッドが完了するとすぐに開始します。ただし、アプリケーションから別の動作が必要です。メソッドのパフォーマンスが完了していない場合、クライアントはメッセージを受信し、以前のクエリがまだ進行中であり、新しいクエリを削除する必要があります。エコー機能を変更してマルチタスクを防止するにはどうすればよいですか? 1つの要求だけが関数を呼び出します。いずれかの機能がまだ機能している場合は、後で試すために、別の要求がクライアントにメッセージとともにドロップされます。

+3

あなたが説明したことを行う必要があります。これを行うための組み込みメソッドはありません。同じユーザーかどうかを判断するための組み込みメソッドもありません。実装を試してください。問題が発生した場合は、それについて質問を投稿してください。 – Adrian

答えて

0

まず、break句のない無限ループがあります。

セッションまたはCookie管理の助けを借りずにクライアントがサーバーに後続の要求を送信するのを防ぐことはできません。私がやることは、クライアントがあなたのサーバにアクセスし、他のリソースを訪れるために必要なクッキーを作るときに、クライアントにクッキーを割り当てることです。クライアントが要求を正常に送信したら、現在のクライアントにバックグラウンドで実行中のプロセスがあることを反映するために、クッキー内のデータを更新します。クライアントがクッキーをクリアする可能性があるため、サーバー側でもセッション管理が必要な場合があります。