-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtimeout.go
49 lines (40 loc) · 1.3 KB
/
timeout.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
Шаблон Timeout (Тайм-аут) позволяет процессу прекратить ожидание ответа,
когда станет очевидно, что его можно вообще не получить.
Client - клиент, обращающийся к SlowFunction.
SlowFunction - функция, возвращающая ответ, необходимый клиенту, и выполняющаяся
очень долго.
Timeout - функция-обертка вокруг SlowFunction, которая реализует логику тайм-аута.
*/
package go_cloud_patterns
import (
"context"
)
type SlowFunction func(string) (string, error)
type WithContext func(context.Context, string) (string, error)
func Timeout(f SlowFunction) WithContext {
return func(ctx context.Context, arg string) (string, error) {
chres := make(chan string)
cherr := make(chan error)
go func() {
res, err := f(arg)
chres <- res
cherr <- err
}()
select {
case res := <-chres:
return res, <-cherr
case <-ctx.Done():
return "", ctx.Err()
}
}
}
//func main() {
// ctx := context.Background()
// ctxt, cancel := context.WithTimeout(ctx, 1*time.Second)
// defer cancel
//
// timeout := Timeout(Slow)
// res, err := timeout(ctxt, "some input")
// fmt.Println(res, err)
//}