func SolveTask(client ClientInfo, task_data []byte, task_id int) { fmt.Println("SolveTask: Start") task := tsp_types.TaskType{} task.FromXml(task_data) new_task := &TaskQueueItem{} new_task.Init(task_id) task_queue.PushBack(new_task) go TaskHandler(new_task) go AnswerCombiner(new_task) //split enabled, task1, task2 := tsp_solver.CrusherImpl(&task) for enabled { new_task.SubTasks <- task1 new_task.SentTasksCount.Inc() new_task.PreparedTasks <- true task2.MinCost = new_task.CurrMinCost.Get() enabled, task1, task2 = tsp_solver.CrusherImpl(task2) } new_task.PrepareFinished = true new_task.PreparedTasks <- false final_answer := <-new_task.FinalAnswer msg := []byte(final_answer.ToXml()) err := binary.Write(*client.Conn, binary.LittleEndian, int64(len(msg))) if err != nil { fmt.Printf("[SolveTask] Write data error: %v", err) return } (*client.Conn).Write(msg) task_queue.Remove(new_task.ID) fmt.Println("[SolveTask] Finish") }