Usando go trabajos con función genérica -- beginner campo con multithreading campo con go camp codereview Relacionados El problema

Using go jobs with generic function


2
vote

problema

Español

Utilizo lo siguiente que funciona (Retiro las piezas de nonnecery a la pregunta)

https://play.golang.org/p/oozjexj4hzk

El programa está haciendo lo siguiente:

  1. ejecutar funciones concurrentes
  2. Cada función debe devolver la respuesta
  3. calcula la respuesta

Añadiré un registro y comentarios, pero quiero obtener comentarios sobre el código. ¿Qué no estoy seguro si uso Content0 y Content1 de una manera limpia, pero funciona ...

  Content2  
Original en ingles

I use the following which works( I remove the unnnecery parts to the question)

https://play.golang.org/p/OozjexJ4hZk

The program is doing the following:

  1. run concurrent functions
  2. each function should return response
  3. calculate the response

I will add a logs and comments but I want to get feedback on the code. What Im not sure if I use clientA and clientB in a clean way,but it works...

 package main  import (     "context"     "fmt"     `net/http`      "time"      "github.com/gammazero/workerpool"     `k8s.io/client-go/kubernetes`  )  type JobReact struct {     name     string     Duration time.Duration     Info     interface{}     Error    error }  func (m *JobReact) Name() string {     return m.name }  type GenClient struct {     ClientA http.Client     ClientB kubernetes.Clientset }  type ResultList struct {     response http.Response }  // Jobs holds job data type Jobs struct {     Name   string     Runner func(*GenClient) JobReact }  func wrapper(timeDuration time.Duration, reacts chan JobReact, jobs Jobs, genClient GenClient, ) func() {     contextWithTimeout, tc := context.WithTimeout(context.Background(), timeDuration)     return func() {         now := time.Now()         go func(contx context.Context, cancelFunc context.CancelFunc, jobReacts chan JobReact, jobs Jobs, timer time.Time,         ) {             // Here I need to use the combined clients , should I use some interface? if yes how?             runner := jobs.Runner(&genClient)             runner.Duration = time.Since(timer)             runner.name = jobs.Name             if contextWithTimeout.Err() == nil {                 jobReacts <- runner             }             cancelFunc()         }(contextWithTimeout, tc, reacts, jobs, now)         select {         case <-contextWithTimeout.Done():             switch contextWithTimeout.Err() {             case context.DeadlineExceeded:                 reacts <- JobReact{                     name:     jobs.Name,                     Error:    context.DeadlineExceeded,                     Duration: time.Since(now),                 }             }         }     } }  func main() {     // init clients     genClients := GenClient{ClientA: ClientA(), ClientB: ClientB()}      jobs := []Jobs{         {             Name: "job1",             Runner: func(GenClient *GenClient) JobReact {             // In this func I need to use client A                 GenClient.ClientA                 ...             },         },         {             Name: "job2",             Runner: func(genClient *GenClient) JobReact {             // In this func I need to use client b                 GenClient.ClientB                 ...             },         },         {             Name: "job3",             Runner: func(genClient *GenClient) JobReact {             // In this func I need to use Client A & client B                 GenClient.ClientB                 GenClient.ClientA                 ...             },         },     }      JobRes := make(chan JobReact, len(jobs))     pool := workerpool.New(5)      for _, worker := range jobs {         pool.Submit(wrapper(time.Duration(time.Second * 10), JobRes, worker, genClients))     }     pool.StopWait()     GetAllResponses(JobRes) }  func GetAllResponses(wr chan JobReact) ResultList {     for jobChannel := range wr {         if jobChannel.Info != 200 {             fmt.Printf("job %s: took '%d' sec response: %s\n", jobChannel.Name(), jobChannel.Duration.Seconds(), jobChannel.Error)             return ResultList{response: http.Response{StatusCode: 500}}         }         fmt.Printf("job %s: took '%d' sec response: %s\n", jobChannel.Name(), jobChannel.Duration.Seconds(), jobChannel.Info)     }     return ResultList{response: http.Response{StatusCode: 200}} }  func ClientA() http.Client {     c := &http.Client{}     return *c }   func ClientB() kubernetes.Clientset {     ....     return *clientset } 
        

Lista de respuestas


Relacionados problema

1  Formateo de un archivo de texto cambia como HTML  ( Formatting a changes text file as html ) 
Tengo una función que se usa para convertir texto (un archivo de cambios) en HTML para leer. La función es esencialmente basada en línea: si la línea es de es...

4  Pasando alrededor del contexto.Context en Golang  ( Passing around context context in golang ) 
Actualmente soy "graciosamente" Manejar el servidor HTTP net/http Apagado que funciona perfectamente bien ( No le estoy pidiendo que revise el cierre del se...

2  Consulta Seleccione e inserte si no existe  ( Query select and insert if not exists ) 
¿Hay alguna buena manera de hacer este método más corto? "var text = document.getElementById('text'); var greeting = ['Hello. I am a console wannabe.', ...

7  Árboles binarios equivalentes (un recorrido por go)  ( Equivalent binary trees a tour of go ) 
Cualquier sugerencia sobre cómo mejorar el código que se muestra a continuación para la Ejercicio de go-tour ? < / p> Descripción del ejercicio: Puede ha...

1  Solicitar enrutador escrito en Go  ( Request router written in go ) 
Comencé a aprender Idioma y me imaginé escribir otro enrutador de solicitud, ya que lo necesito para mi próximo proyecto Go. Como es lo que es lo primero que ...

5  Herramienta para calcular el tiempo promedio que toma para una solicitud de tracción GitHub para fusionar  ( Tool to calculate the average time that takes for a github pull request to get m ) 
Estoy aprendiendo, y este es mi primer intento de una herramienta de línea de comandos que usa la API de GitHub para calcular el tiempo promedio que toma una ...

7  Descarga concurrente en Go  ( Concurrent download in go ) 
Escribí un programa para descargar archivos en manera concurrente / paralelo (gomaxprocs & gt; 1). Este es mi programa 2 nd (no juguete) escrito en Go. Po...

3  Archivo de registro diferido Cerrar  ( Deferred log file close ) 
Mi código funciona en que se compila, y cuando se ejecuta, escribe un archivo de registro utilizando un escritor búfer. pero me pregunto si: Soy correcto...

6  Implementando una API de descanso en Ir usando Gorilla / Mux y Gorm  ( Implementing a rest api in go using gorilla mux and gorm ) 
Mientras está aprendiendo, decidí implementar una API de descanso simple para conocer el idioma y, dado que estoy inexperto en el principio, apreciaría cualq...

12  Entrevista de concurrencia  ( Concurrency interview ) 
Un poco de vuelta, tuve una entrevista donde plantearon un problema, en resumen: Mire un determinado directorio, y procese archivos JSON entrantes Estos ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos