հիմնական փաթեթ func main() { c := make(chan int, 1) 3 անգամ ցիկլ { ընտրություն { ըստ նախնական: println(1) դեպք <-c: println(2) դեպք c <- 1: println(3) } } }
Golang
```go func fail() { panic("Անհաջողություն!") } func main() { fmt.Println("Սկիզբ!") 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("Ազատություն!") } ```
Ինչու եք ընտրել Elasticsearch-ը: Ինչ տարբերակներ էին: Որոշեցիք ինչ-որ բան, թե պարզապես ELK արդեն գոյություն ուներ?
Կա՞ն հարցեր ձեր նախագծերի կամ աշխատանքային պայմանների մասին:
Դու ասում ես, որ Elasticsearch-ով ստեղծել ես արագ որոնման գործիք՝ գործարքների համար: Դա ինչ է, քանի գործարք կա և ինչ օգուտ ունի դա?
Վերջապես, որ լուծումներից եք ընտրել? ClickHouse, ELK և ինչ էլի?
func fetch(ctx context.Context, u User) (string, error) { // ինչ-որ բան ենք անում ցանցում time.Sleep(time.Millisecond * 10) // պատճենման սիմուլյացիա return u.Name, nil //return "", errors.New("մի որոշ սխալ") } 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: } }() }
Ի՞նչ կապ ունի ծառայությունների հետ, եթե մենք խոսում ենք սխալի հանդուրժողականության մասին և դա վերածել ենք կրկնօրինակումների։
Որտե՞ղ եք այժմ աշխատում:
Երբ Elasticsearch-ը ներդրվեց, օգտվողներից կամ տեխնիկական աջակցության ծառայությունից ինչ-որ արձագանք եղավ?
Ինչ է դարձնում համակարգը բարձր բեռով: Ձեր փորձի վրա հիմնվելով։
Կնքե՞լ եք զինվորական գրքույկ։
հիմնական պակետ միավորել ( "fmt" ) գործառույթ main() { c := make(chan string, 1) go fmt.Println(<-c) c <- "Salom Dunyo!" fmt.Println("Chiqish!") } վտանգավոր սխալ: բոլոր goroutine-ները քնած են - deadlock! goroutine 1 [канալ ընդունում]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Ծրագիրը ավարտվեց: վիճակ 2.
Որքան գումարից եք դիտարկում առաջարկը?
հիմնական փաթեթ func main() { c := make(chan int) 3 տողի համար { select { ըստ նախընտրության: println(1) դեպք <-c: println(2) դեպք c <- 1: println(3) } } }
հիմնական փաթեթ միացումներ ( "fmt" ) գործառույթ գլխավոր() { c := make(chan string) գումար fmt.Println(<-c) c <- "Hello World!" fmt.Println("Ելք!") }
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() }
հիմնական փաթեթ միավոր ( "fmt" ) գործառույթ main() { c := make(chan string) go fmt.Println(<-c) c <- "Բարեւ աշխարհ!" fmt.Println("Ելք!") } վտանգավոր սխալ: բոլոր goroutine-ները քնած են - deadlock! goroutine 1 [կանալի ընդունում]: main.main() /tmp/sandbox[phone]/prog.go:10 +0x3a Ծրագիրը դուրս եկավ: վիճակ 2.
Որտե՞ղ եք հիմա ապրում:
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 }