pagrindinis paketas func main() { c := make(chan int, 1) per range 3 { select { numatyta: println(1) atvejis <-c: println(2) atvejis c <- 1: println(3) } } }
Golang
```go func fail() { panic("Nepavyko!") } func main() { fmt.Println("Pradžia!") var wg sync.WaitGroup wg.Add(1) go func() { defer func() { if e := recover(); e != nil { fmt.Println(e) } }() fail() wg.Done() }() wg.Wait() fmt.Println("Pabaiga!") } ```
Kodėl pasirinkote Elasticsearch? Kokios buvo kitos galimybės? Ar ką nors pasirinkote ar tiesiog jau buvo ELK?
Ar turite klausimų apie projektus ar darbo sąlygas?
Sakai, kad su Elasticsearch sukūrei įrankį greitam sandorių paieškai. Kas tai yra, kiek sandorių yra ir kokia iš to nauda?
func fetch(ctx context.Context, u User) (string, error) { // kažkas darome tinkle time.Sleep(time.Millisecond * 10) // vėlavimo imitacija return u.Name, nil //return "", errors.New("kita klaida") } func Do(ctx context.Context, users []User) (map[string]int64, error) { var mu sync.Mutex var wg sync.WaitGroup ch := make(chan error, len(users)) names := make(map[string]int64, 0) ctxWithCancel, cancel := context.WithCancel(ctx) wg.Add(len(users)) for _, u := range users { go func() { defer wg.Done() select { case name, err := fetch(ctx, u): if err != nil { ch <- err return } mu.Lock() names[name] = names[name] + 1 mu.Unlock() case <-ctxWithCancel.Err: } }() }
Galų gale, iš kokių sprendimų pasirinkote? ClickHouse, ELK ir kas dar?
Kur dirbate šiuo metu?
Po Elasticsearch diegimo ar buvo kokių nors atsiliepimų iš vartotojų ar techninės pagalbos tarnybos?
Kas daro sistemą didelės apkrovos? Remiantis savo patirtimi.
Ar turite karinę pažymėjimą?
Nuo kokios sumos svarstote pasiūlymą?
pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Labas pasauli!" fmt.Println("Išeiti!") } mirtina klaida: visos gorutinos miega - deadlock! goroutine 1 [kanalo priėmimas]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa baigėsi: būklė 2.
pagrindinis paketas func main() { c := make(chan int) 3 ciklai { select { numatyta: println(1) atvejis <-c: println(2) atvejis c <- 1: println(3) } } }
pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Hello World!" fmt.Println("Išeiti!") }
Koks ryšys su paslaugomis, jei kalbame apie gedimų toleranciją ir tai sumažinome iki replikų?
var defaultTxOptions = &sql.TxOptions{} const defaultCurrency = "RUB" func CreateUserWithDefaultCurrency(ctx context.Context, db *sql.DB, email, passwordHash string) error { tx, err := db.BeginTx(ctx, defaultTxOptions) if err != nil { return err } defer func() { if err != nil{ tx.Rollback() } }() _, err = tx.Exec("INSERT INTO users (email, password) VALUES (?, ?)", email, passwordHash) if err != nil { return err } rows, err := tx.Query("SELECT id FROM users WHERE email = ?", email) if err != nil { return err } defer rows.Close() id := 0 for rows.Next() { err = rows.Scan(&id) if err != nil { return err } } _, err = tx.Exec("INSERT INTO balances (user_id, currency, current_balance) VALUES (?, ?, 0)", id, defaultCurrency) if err != nil { return err } return tx.Commit() }
pagrindinis paketas importuoti ( "fmt" ) func main() { c := make(chan string) go fmt.Println(<-c) c <- "Labas pasauli!" fmt.Println("Išeiti!") } mirtina klaida: visi gorutinai miega - deadlock! goroutine 1 [kanalo priėmimas]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Programa baigėsi: būklė 2.
Kur šiuo metu gyvenate?
func Do(ctx context.Context, users []User) (map[string]int64, error) { var mu sync.Mutex var wg sync.WaitGroup ch := make(chan error, len(users)) names := make(map[string]int64, 0) ctxWithCancel, cancel := context.WithCancel(ctx) wg.Add(len(users)) for _, u := range users { go func() { defer wg.Done() select { case name, err := fetch(ctx, u): if err != nil { ch <- err return } mu.Lock() names[name] = names[name] + 1 mu.Unlock() case <-ctxWithCancel.Err: } }() } return names, nil }