Fit slides to screen

This commit is contained in:
Fedor Korotkiy 2020-04-02 17:01:16 +03:00
parent 69342a7b45
commit 19d79613cd
11 changed files with 59 additions and 62 deletions

View file

@ -8,7 +8,6 @@ import (
func SimpleCancelation() {
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go func() {
time.Sleep(5 * time.Second)
cancel()
@ -19,6 +18,8 @@ func SimpleCancelation() {
}
}
// OMIT
func SimpleTimeout() {
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
@ -28,6 +29,8 @@ func SimpleTimeout() {
}
}
// OMIT
func doSlowJob(ctx context.Context) error {
for {
select {

View file

@ -22,7 +22,6 @@ func (h handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
defer fd.Close()
scanner := bufio.NewScanner(fd)
for scanner.Scan() {
select {
case <-ctx.Done():

View file

@ -3,7 +3,6 @@ package main
import (
"crypto/tls"
"crypto/x509"
"errors"
"net/http"
"net/http/cookiejar"
"time"
@ -13,16 +12,9 @@ func main() {
// все куки записанные в этот Jar будут передаваться
// и изменяться во всех запросах
cj, _ := cookiejar.New(nil)
client := &http.Client{
Timeout: 1 * time.Second,
Jar: cj,
CheckRedirect: func(req *http.Request, via []*http.Request) error {
if len(via) > 20 {
return errors.New("too many redirects")
}
return nil
},
Transport: &http.Transport{
// резмер буферов чтения и записи (4KB по-умолчанию)
WriteBufferSize: 32 << 10,
@ -38,6 +30,5 @@ func main() {
// ...
},
}
_ = client
}

View file

@ -10,13 +10,12 @@ import (
func main() {
body := bytes.NewBufferString("All your base are belong to us")
req, err := http.NewRequest("POST", "https://myapi.com/create", body)
req, err := http.NewRequest(http.MethodPost, "https://myapi.com/create", body)
if err != nil {
log.Fatal(err)
}
req.Header.Set("X-Source", "Zero Wing")
repr, err := httputil.DumpRequestOut(req, true)
if err == nil {
fmt.Println(string(repr))
@ -26,6 +25,6 @@ func main() {
if err != nil {
log.Fatal(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
}

View file

@ -17,16 +17,15 @@ func main() {
}
}
func run() error {
handler := func(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("pong"))
}
func handler(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("pong"))
}
func run() error {
srv := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(handler),
}
serveChan := make(chan error, 1)
go func() {
serveChan <- srv.ListenAndServe()
@ -34,15 +33,13 @@ func run() error {
stop := make(chan os.Signal, 1)
signal.Notify(stop, syscall.SIGINT, syscall.SIGTERM)
select {
case <-stop:
fmt.Println("shutting down gracefully")
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return srv.Shutdown(ctx)
case err := <-serveChan:
return err
}

View file

@ -7,6 +7,13 @@ import (
"strconv"
)
func NewAPICLient(baseURL string) *APIClient {
if baseURL == "" {
baseURL = BaseURLProd
}
return &APIClient{baseURL: baseURL, httpc: new(http.Client)}
}
const (
BaseURLProd = "https://github.com/api"
)
@ -16,26 +23,14 @@ type APIClient struct {
httpc *http.Client
}
func NewAPICLient(baseURL string) *APIClient {
if baseURL == "" {
baseURL = BaseURLProd
}
return &APIClient{
baseURL: baseURL,
httpc: new(http.Client),
}
}
func (c *APIClient) GetReposCount(ctx context.Context, userID string) (int, error) {
url := c.baseURL + "/users/" + userID + "/repos/count"
req, _ := http.NewRequestWithContext(ctx, "GET", url, nil)
resp, err := c.httpc.Do(req)
if err != nil {
return 0, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return 0, err

View file

@ -9,20 +9,13 @@ import (
func main() {
urls := []string{"https://golang.org/doc", "https://golang.org/pkg", "https://golang.org/help"}
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true,
},
},
Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true}},
}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)
go func(url string) {
defer wg.Done()
resp, err := client.Get(url)

View file

@ -11,14 +11,9 @@ import (
func main() {
urls := []string{"https://golang.org/doc", "https://golang.org/pkg", "https://golang.org/help"}
client := &http.Client{
Transport: &http.Transport{
MaxConnsPerHost: 100,
},
}
client := &http.Client{Transport: &http.Transport{MaxConnsPerHost: 100}}
var wg sync.WaitGroup
for _, url := range urls {
wg.Add(1)

View file

@ -1,7 +1,7 @@
http и context
Лекция 6
Георгий Зуйков
Фёдор Короткий
* Имеем из коробки
@ -34,7 +34,7 @@ http и context
* Делаем более лучший запрос
.play custompost/custompost.go
.play custompost/custompost.go /func/,/^}/
`http.DefaultClient` - базовый глобальный клиент с настройками по-умолчанию.
@ -87,12 +87,20 @@ http и context
.code simpleserver/simpleserver.go /func RunTLSServer/,/^}/
http.Handler - интерфейс, описывающий функцию для обработки HTTP запроса.
* Простой HTTP сервер
`http.Handler` - интерфейс, описывающий функцию для обработки HTTP запроса.
type Handler interface {
ServeHTTP(ResponseWriter, *Request)
}
type ResponseWriter interface {
Header() Header
WriteStatus(int)
Write([]byte) (int, error)
}
* Роутинг
.code simpleserver/router.go /func RunServerWithRouting/,/OMIT/
@ -119,10 +127,6 @@ http.Handler - интерфейс, описывающий функцию для
* context
Контекст - инкапсулированное состояние определенной части приложения.
Позволяет оповещать операции о необходимости завершения и/или передавать контекстозависимые значения между различными частями приложения.
Контексты наследуемы, при отмене закрывается родительский и все дочерние контексты.
type Context interface {
// Возвращает время, когда операция будет оповещена о необходимости завершения
Deadline() (deadline time.Time, ok bool)
@ -142,15 +146,37 @@ http.Handler - интерфейс, описывающий функцию для
Value(key interface{}) interface{}
}
- Отмена таймауты
- Передача request scoped значений
* context
Типы контекстов:
- TODO
- Background
- Cancel
- Deadline
// root context
todo := context.TODO()
ctx := context.Background()
// manual cancel
ctx, cancel := context.WithCancel(ctx)
defer cancel()
// cancel by timeout
ctx, cancel := context.WithTimeout(ctx, 100*time.Millisecond)
defer cancel()
ctx, cancel := context.WithDeadline(ctx, time.Now().Add(time.Second))
defer cancel()
* Отменяем операции
.code context/cancelation/cancelation.go /func SimpleCancelation()/,/OMIT/
.code context/cancelation/cancelation.go /func doSlowJob/,/OMIT/
* Отменяем операции
.code context/cancelation/cancelation.go /func SimpleTimeout()/,/OMIT/
.code context/cancelation/cancelation.go /func doSlowJob/,/OMIT/
* context в библиотеках Go

View file

@ -10,5 +10,6 @@ func main() {
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Println(resp.StatusCode)
}

View file

@ -15,7 +15,6 @@ func RunServerWithRouting() {
w.WriteHeader(404)
}
}
err := http.ListenAndServe(":8080", http.HandlerFunc(router))
if err != nil {
panic(err)
@ -25,7 +24,6 @@ func RunServerWithRouting() {
func pongHandler(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("pong"))
}
func shmongHandler(w http.ResponseWriter, r *http.Request) {
_, _ = w.Write([]byte("shmong"))
}