
рдЧреЛ рдореЗрдВ рд╕рдВрджрд░реНрдн рдкреИрдХреЗрдЬ рдПрдкреАрдЖрдИ рдФрд░ рдзреАрдореА рдкреНрд░рдХреНрд░рд┐рдпрд╛рдУрдВ рдХреЗ рд╕рд╛рде рдмрд╛рддрдЪреАрдд рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ, рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЙрддреНрдкрд╛рджрди-рдЧреНрд░реЗрдб рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдореЗрдВ рдЬреЛ рд╡реЗрдм рдЕрдиреБрд░реЛрдзреЛрдВ рд╕реЗ рдирд┐рдкрдЯрддреЗ рд╣реИрдВред рдЗрд╕рдХреА рдорджрдж рд╕реЗ, рдЧреЛрд░реЛрдЗрдЯрд┐рди рдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдиреАрдЪреЗ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЗрд╕ рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЫреЛрдЯрд╛ рдЧрд╛рдЗрдб рд╣реИ, рд╕рд╛рде рд╣реА рд╕рд╛рде рдХреБрдЫ рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕ рдФрд░ рдиреБрдХрд╕рд╛рди рднреА рд╣реИрдВред
(рдиреЛрдЯ: рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдИ рдкреИрдХреЗрдЬреЛрдВ рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдбреЙрдХрд░ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ)ред
рд╢реБрд░реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ
рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдпрд╣ рд╕рдордЭрдирд╛ рдЪрд╛рд╣рд┐рдП рдХрд┐ рдЧреЛрд░реЛрдЗрди рдФрд░ рдЪреИрдирд▓ рдХреНрдпрд╛ рд╣реИрдВред рдореИрдВ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░реВрдВрдЧрд╛ред рдпрджрд┐ рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЙрдирд╕реЗ рдкрд░рд┐рдЪрд┐рдд рд╣реИрдВ, рддреЛ рд╕реАрдзреЗ рдкреНрд░рд╕рдВрдЧ рдЕрдиреБрднрд╛рдЧ рдкрд░ рдЬрд╛рдПрдБред
Gorutina
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рдХрд╣рддрд╛ рд╣реИ рдХрд┐ "рдЧреЛрд░реБрдЯрд┐рди рдирд┐рд╖реНрдкрд╛рджрди рдХреА рдПрдХ рд╣рд▓реНрдХреА рдзрд╛рд░рд╛ рд╣реИред" рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдереНрд░реЗрдбреНрд╕ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рд╣рд▓реНрдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдирд╛ рдЕрдкреЗрдХреНрд╖рд╛рдХреГрдд рдХрдо рд╕рдВрд╕рд╛рдзрди рдЧрд╣рди рд╣реЛрддрд╛ рд╣реИред
тЖТ рд╕реИрдВрдбрдмреЙрдХреНрд╕
package main import "fmt" // , Hello func printHello() { fmt.Println("Hello from printHello") } func main() { // // go func(){fmt.Println("Hello inline")}() // go printHello() fmt.Println("Hello from main") }
рдпрджрд┐ рдЖрдк рдЗрд╕ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдЪрд▓рд╛рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рджреЗрдЦреЗрдВрдЧреЗ рдХрд┐ Hello from main
рдХреЗрд╡рд▓ Hello from main
рдореБрджреНрд░рд┐рдд рд╣реИред рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рджреЛрдиреЛрдВ рдЧреЛрд░рдЖрдЙрдЯ рд╢реБрд░реВ рд╣реЛрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди main
рдЦрддреНрдо рдкрд╣рд▓реЗред рдЗрд╕рд▓рд┐рдП, рдЧреЛрд░реВрдЯрд╛рдЗрди рдХреЛ рдЕрдкрдиреЗ рдирд┐рд╖реНрдкрд╛рджрди рдХреЗ рдЕрдВрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ main
рд╕реЗ рд╕реВрдЪрд┐рдд рдХрд░рдиреЗ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рддрд╛рдХрд┐ рд╡рд╣ рдЗрд╕рдХреЗ рд▓рд┐рдП рдЗрдВрддрдЬрд╛рд░ рдХрд░реЗред рдпрд╣рд╛рдВ рдЪреИрдирд▓ рд╣рдорд╛рд░реА рд╕рд╣рд╛рдпрддрд╛ рдХреЗ рд▓рд┐рдП рдЖрддреЗ рд╣реИрдВред
рдЪреИрдирд▓ (рдЪреИрдирд▓)
рдЪреИрдирд▓ рдЧреЛрд░реЛрдиреЗрд╕ рдХреЗ рдмреАрдЪ рд╕рдВрдЪрд╛рд░ рдХрд╛ рдПрдХ рддрд░реАрдХрд╛ рд╣реИред рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рдЖрдк рдкрд░рд┐рдгрд╛рдо, рддреНрд░реБрдЯрд┐рдпреЛрдВ рдпрд╛ рдЕрдиреНрдп рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдПрдХ рдЧреЛрд░реЛрдЗрди рд╕реЗ рджреВрд╕рд░реЗ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЪреИрдирд▓ рд╡рд┐рднрд┐рдиреНрди рдкреНрд░рдХрд╛рд░ рдХреЗ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рдХрд╛рд░ рдХрд╛ рдПрдХ рдЪреИрдирд▓ int
рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЯрд╛рдЗрдк error
рдХрд╛ рдПрдХ рдЪреИрдирд▓ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдЖрджрд┐ред
рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░реЗ рдкрд╛рд╕ int
рдХрд╛ рдПрдХ ch
рдЪреИрдирд▓ рд╣реИред рдпрджрд┐ рдЖрдк рдЪреИрдирд▓ рдХреЛ рдХреБрдЫ рднреЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рд╡рд╛рдХреНрдп рд░рдЪрдирд╛ ch <- 1
ред рдЖрдк рдЪреИрдирд▓ рд╕реЗ рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: var := <- ch
, i.e. рдЪреИрдирд▓ рд╕реЗ рдорд╛рди рд▓реЗрдВ рдФрд░ рдЗрд╕реЗ рдЪрд░ рдЪрд░ рдореЗрдВ рд╕рд╣реЗрдЬреЗрдВред
рдирд┐рдореНрди рдХреЛрдб рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдП рдЗрд╕рдХреА рдкреБрд╖реНрдЯрд┐ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЧреЛрд░рдЖрдЙрдЯреНрд╕ рдиреЗ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░ рд▓рд┐рдпрд╛ рд╣реИ рдФрд░ рдЕрдкрдиреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ main
рд╡рд╛рдкрд╕ рдХрд░ рджрд┐рдпрд╛ рд╣реИред
рдиреЛрдЯ: рдкреНрд░рддреАрдХреНрд╖рд╛ рд╕рдореВрд╣реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдХреЗ рд▓рд┐рдП рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдореИрдВрдиреЗ рдХреЛрдб рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЪрдпрди рдХрд┐рдпрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдмрд╛рдж рдореЗрдВ рд╕рдВрджрд░реНрдн рдЕрдиреБрднрд╛рдЧ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред
тЖТ рд╕реИрдВрдбрдмреЙрдХреНрд╕
package main import "fmt" // int func printHello(ch chan int) { fmt.Println("Hello from printHello") // ch <- 2 } func main() { // . make // : // ch := make(chan int, 2), . ch := make(chan int) // . , . // go func(){ fmt.Println("Hello inline") // ch <- 1 }() // go printHello(ch) fmt.Println("Hello from main") // // , i := <- ch fmt.Println("Received ",i) // // , <- ch }
рд╕рдВрджрд░реНрдн (рд╕рдВрджрд░реНрдн)
рдЬрд╛рдиреЗ рдХрд╛ рд╕рдВрджрд░реНрдн рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ "рд╕рдВрджрд░реНрдн" рдореЗрдВ рдЕрдкрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рдбреЗрдЯрд╛ рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ, рд╕рдордп рд╕реАрдорд╛ рдпрд╛ рдЪреИрдирд▓ рдХреА рддрд░рд╣ рд╕рдВрджрд░реНрдн, рдПрдХ рд╢рдЯрдбрд╛рдЙрди рдХрд╛ рд╕рдВрдХреЗрдд рджреЗрддрд╛ рд╣реИ рдФрд░ рдХреЙрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдПрдХ рд╡реЗрдм рдЕрдиреБрд░реЛрдз рдХрд░рддреЗ рд╣реИрдВ рдпрд╛ рдПрдХ рд╕рд┐рд╕реНрдЯрдо рдХрдорд╛рдВрдб рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЙрддреНрдкрд╛рджрди-рдЧреНрд░реЗрдб рд╕рд┐рд╕реНрдЯрдо рдХреЗ рд▓рд┐рдП рдЯрд╛рдЗрдордЖрдЙрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЕрдЪреНрдЫрд╛ рд╣реЛрдЧрд╛ред рдХреНрдпреЛрдВрдХрд┐ рдпрджрд┐ рдЖрдк рдЬрд┐рд╕ рдПрдкреАрдЖрдИ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░ рд░рд╣реЗ рд╣реИрдВ рд╡рд╣ рдзреАрдорд╛ рд╣реИ, рддреЛ рдЖрдк рдЕрдкрдиреЗ рд╕рд┐рд╕реНрдЯрдо рдкрд░ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рдЬрдорд╛ рдХрд░рдиреЗ рдХреА рд╕рдВрднрд╛рд╡рдирд╛ рдирд╣реАрдВ рд░рдЦрддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рдЗрд╕рд╕реЗ рдЖрдкрдХреЗ рд╕реНрд╡рдпрдВ рдХреЗ рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп рд▓реЛрдб рдореЗрдВ рдХрдореА рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рдХрдореА рдЖ рд╕рдХрддреА рд╣реИред рдкрд░рд┐рдгрд╛рдо рдПрдХ рдЭрд░рдирд╛ рдкреНрд░рднрд╛рд╡ рд╣реИред
рдФрд░ рдпрд╣рд╛рдВ рдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд╕рдордп рд╕реАрдорд╛ рдХрд╛ рд╕рдВрджрд░реНрдн рд╕рд╣реА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдкреНрд░рд╕рдВрдЧ рдирд┐рд░реНрдорд╛рдг
рд╕рдВрджрд░реНрдн рдкреИрдХреЗрдЬ рдЖрдкрдХреЛ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рддрд░реАрдХреЛрдВ рд╕реЗ рд╕рдВрджрд░реНрдн рдмрдирд╛рдиреЗ рдФрд░ рдЗрдирд╣реЗрд░рд┐рдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ:
рд╕рдВрджрд░реНрднред рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб () ctx рд╕рдВрджрд░реНрдн
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЦрд╛рд▓реА рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ (рдореБрдЦреНрдп рдпрд╛ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдХреЗ рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд░ рдореЗрдВ) рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрдиреНрдп рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣рдо рдмрд╛рдж рдореЗрдВ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВрдЧреЗред
ctx, cancel := context.Background()
рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕ред: рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЕрд╢реБрджреНрдзрд┐ рд╣реИ, context.Background
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рдЙрджрд╛рд╣рд░рдгред context.Background
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:
ctx := context.Background()
рд╕рдВрджрд░реНрднред TODO () ctx рд╕рдВрджрд░реНрдн
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рдЦрд╛рд▓реА рд╕рдВрджрд░реНрдн рднреА рдмрдирд╛рддрд╛ рд╣реИред рдФрд░ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рднреА рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рддреЛ рдЬрдм рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рди рд╣реЛрдВ рдХрд┐ рдХрд┐рд╕ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рдЕрднреА рддрдХ рд╡рд╛рдВрдЫрд┐рдд рд╕рдВрджрд░реНрдн рдкреНрд░рд╛рдкреНрдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк (рдпрд╛ рдХреЛрдИ рд╡реНрдпрдХреНрддрд┐ рдЬреЛ рдХреЛрдб рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ) рдмрд╛рдж рдореЗрдВ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдВрджрд░реНрдн рдЬреЛрдбрд╝рдиреЗ рдХреА рдпреЛрдЬрдирд╛ рдмрдирд╛рддрд╛ рд╣реИред
ctx, cancel := context.TODO()
рд▓рдЧрднрдЧред рдЯреНрд░рд╛рдВрд╕ред: рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЕрд╢реБрджреНрдзрд┐ рд╣реИ, context.TODO
рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рд╕рд╣реА рдЙрджрд╛рд╣рд░рдгред context.TODO
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реЛрдЧрд╛:
ctx := context.TODO()
рджрд┐рд▓рдЪрд╕реНрдк рд╣реИ, рдХреЛрдб рдкрд░ рдПрдХ рдирдЬрд╝рд░ рдбрд╛рд▓реЗрдВ, рдпрд╣ рдмрд┐рд▓реНрдХреБрд▓ рдкреГрд╖реНрдарднреВрдорд┐ рдХреЗ рд╕рдорд╛рди рд╣реИред рдПрдХрдорд╛рддреНрд░ рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЖрдк рд╕рдВрджрд░реНрдн рд╣рд╕реНрддрд╛рдВрддрд░рдг рдХреА рд╡реИрдзрддрд╛ рдХреА рдЬрд╛рдВрдЪ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрдереИрддрд┐рдХ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЙрдкрдХрд░рдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреЛ рдПрдХ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡рд┐рд╡рд░рдг рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдпреЗ рдЙрдкрдХрд░рдг рдкреНрд░рд╛рд░рдВрднрд┐рдХ рд╕реНрддрд░ рдкрд░ рд╕рдВрднрд╛рд╡рд┐рдд рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЗрд╕реЗ CI / CD рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдпрд╣рд╛рдБ рд╕реЗ :
var ( background = new(emptyCtx) todo = new(emptyCtx) )
рд╕рдВрджрд░реНрдн .Value (рдореВрд▓ рд╕рдВрджрд░реНрдн, рдХреБрдВрдЬреА, рд╡реИрд▓ рдЗрдВрдЯрд░рдлрд╝реЗрд╕ {}) (ctx рд╕рдВрджрд░реНрдн, рд░рджреНрдж рдХрд░реЗрдВ рд░рджреНрдж рдХрд░реЗрдВ)
рд▓рдЧрднрдЧред рд▓реЗрди: рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ рдПрдХ рдЕрд╢реБрджреНрдзрд┐ рд╣реИ, рдЬреЛ context.WithValue
рд▓рд┐рдП рд╕рд╣реА рд╣рд╕реНрддрд╛рдХреНрд╖рд░ context.WithValue
рдЗрд╕ рдкреНрд░рдХрд╛рд░ рд╣реИ:
context.WithValue(parent Context, key, val interface{}) Context
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╕рдВрджрд░реНрдн рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдПрдХ рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ val
key
рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ рдФрд░ рдкреВрд░реЗ рд╕рдВрджрд░реНрдн рдЯреНрд░реА рд╕реЗ рдЧреБрдЬрд░рддрд╛ рд╣реИред рдпрд╣реА рд╣реИ, рдЬреИрд╕реЗ рд╣реА рдЖрдк рдПрдХ WithValue
рд╕рдВрджрд░реНрдн рдмрдирд╛рддреЗ рд╣реИрдВ, рдХрд┐рд╕реА рднреА рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рдХреЛ рдпрд╣ рдорд╛рди рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред
рд╕рдВрджрд░реНрдн рдорд╛рдиреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдиреБрд╢рдВрд╕рд╛ рдирд╣реАрдВ рдХреА рдЬрд╛рддреА рд╣реИ, рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЙрдиреНрд╣реЗрдВ рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рд▓реЗрдирд╛ рдЪрд╛рд╣рд┐рдПред
ctx := context.WithValue(context.Background(), key, "test")
рд╕рдВрджрд░реНрднред рдХреИрдиреНрд╕реЗрд▓ (рдореВрд▓ рд╕рдВрджрд░реНрдн) (ctx рд╕рдВрджрд░реНрдн), рд░рджреНрдж рдХрд░реЗрдВ рд░рджреНрдж рдХрд░реЗрдВ)
рдпрд╣ рдереЛрдбрд╝рд╛ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЙрд╕рдХреЗ рдкрд╛рд╕ рдЧрдП рдорд╛рддрд╛-рдкрд┐рддрд╛ рд╕реЗ рдПрдХ рдирдпрд╛ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИред рдЕрднрд┐рднрд╛рд╡рдХ рдкреГрд╖реНрдарднреВрдорд┐ рд╕рдВрджрд░реНрдн рдпрд╛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рд╕рдВрджрд░реНрдн рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рдФрд░ рдкреВрд░реНрд╡рд╡рдд рдХрд╛рд░реНрдп рд▓реМрдЯрд╛рдП рдЬрд╛рддреЗ рд╣реИрдВред рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рдЗрд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ рдЙрд╕реЗ рд╕рдВрджрд░реНрдн рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ рддреЛ рдЕрдиреНрдп рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдкреВрд░реНрд╡рд╡рдд рдХрд╛рд░реНрдп рдкрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдпрд╣ рджреГрдврд╝рддрд╛ рд╕реЗ рд╣рддреЛрддреНрд╕рд╛рд╣рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЖрдорддреМрд░ рдкрд░ рдпрд╣ рдирд┐рд░реНрдгрдп рд╕рдВрджрд░реНрдн рд░рджреНрдж рдХрд░рдиреЗ рдХреА рдЧрд▓рддрдлрд╣рдореА рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕ рд╡рдЬрд╣ рд╕реЗ, рдЗрд╕ рдореВрд▓ рд╕реЗ рдЙрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ, рд░рджреНрдж рд╕рдорд╛рд░реЛрд╣ рдХреЛ рдкрд╛рд╕ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реИред
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2 * time.Second))
рд▓рдЧрднрдЧред рд▓реЗрди: рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, рд▓реЗрдЦрдХ рдиреЗ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, context.WithCancel
рд▓рд┐рдП, рдЧрд▓рддреА рд╕реЗред context.WithDeadline
рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ред context.WithCancel
рд▓рд┐рдП рд╕рд╣реА рдЙрджрд╛рд╣рд░рдгред context.WithCancel
рд╣реЛрдЧрд╛:
ctx, cancel := context.WithCancel(context.Background())
рд╕рдВрджрд░реНрдн .Deadline (рдореВрд▓ рд╕рдВрджрд░реНрдн, d time.Time) (ctx рд╕рдВрджрд░реНрдн, рд░рджреНрдж рдХрд░реЗрдВ рд░рджреНрдж рдХрд░реЗрдВ)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЕрдкрдиреЗ рдореВрд▓ рд╕реЗ рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдмрд╛рдж рд░рджреНрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдпрд╛ рд░рджреНрдж рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рд╕рдВрджрд░реНрдн рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕рдордп рдкрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдмрд╛рд▓ рдХрд╛рд░реНрдпреЛрдВ рдкрд░ рдкрд╛рд░рд┐рдд рдХрд░ рджреЗрддрд╛ рд╣реИред рдЬрдм рдЗрд╕ рд╕рдВрджрд░реНрдн рдХреЛ рд╕рдордп рд╕реАрдорд╛ рдХреЗ рдмрд╛рдж рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рдЗрд╕ рд╕рдВрджрд░реНрдн рд╡рд╛рд▓реЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рдЕрдзрд┐рд╕реВрдЪрдирд╛ рджреНрд╡рд╛рд░рд╛ рдЕрдзрд┐рд╕реВрдЪрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2 * time.Second))
рд╕рдВрджрд░реНрднред рдЯрд╛рдЗрдордЖрдЙрдЯ (рдореВрд▓ рд╕рдВрджрд░реНрдн, рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдордпред рдЕрд╡рдзрд┐) (ctx рд╕рдВрджрд░реНрдн, рд░рджреНрдж рдХрд░реЗрдВ рд░рджреНрдж рдХрд░реЗрдВ)
рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХреЗ рд╕рдорд╛рди рд╣реИред Deadlineред рдЕрдВрддрд░ рдпрд╣ рд╣реИ рдХрд┐ рд╕рдордп рдХреА рд▓рдВрдмрд╛рдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рджреЗрддрд╛ рд╣реИ рдЬреЛ рд░рджреНрдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рдпрд╛ рдПрдХ рд╕рдордп рдХреЗ рдмрд╛рдж рд░рджреНрдж рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
ctx, cancel := context.WithDeadline(context.Background(), time.Now().Add(2 * time.Second))
рд▓рдЧрднрдЧред рд▓реЗрди: рдореВрд▓ рд▓реЗрдЦ рдореЗрдВ, рд▓реЗрдЦрдХ, рдЬрд╛рд╣рд┐рд░рд╛ рддреМрд░ рдкрд░, context.WithTimeout
рд▓рд┐рдП рдЧрд▓рддреА рд╕реЗред рд╕рдордп-рд╕рдордп рдкрд░ context.WithDeadline
рд╕рд╛рде рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ред context.WithTimeout
рд▓рд┐рдП рд╕рд╣реА рдЙрджрд╛рд╣рд░рдгред context.WithTimeout
рдпрд╣ рд╣реЛрдЧрд╛:
ctx, cancel := context.WithTimeout(context.Background(), 2 * time.Second)
рдЕрдкрдиреЗ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕рдВрджрд░реНрднреЛрдВ рдХрд╛ рд╕реНрд╡рд╛рдЧрдд рдФрд░ рдЙрдкрдпреЛрдЧ
рдЕрдм рдЬрдм рд╣рдо рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн (рдкреГрд╖реНрдарднреВрдорд┐ рдФрд░ TODO) рдХреИрд╕реЗ рдмрдирд╛рдПрдВ рдФрд░ рд╕рдВрджрд░реНрдн рдХреИрд╕реЗ рдЙрддреНрдкрдиреНрди рдХрд░реЗрдВ (WithValue, WithCancel, Deadline рдФрд░ Timeout), рдЖрдЗрдП рдЪрд░реНрдЪрд╛ рдХрд░реЗрдВ рдХрд┐ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдВрджрд░реНрдн рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рди рдЧреЛрд░реЛрдЗрди рдХреЛ рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЙрдореНрдореАрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╡рд╣ рд╕рдВрджрд░реНрдн рдХреЛ рд╡рд╛рдкрд╕ рдХрд░ рджреЗрдЧрд╛ рдпрд╛ рд░рджреНрдж рдХрд░ рджреЗрдЧрд╛ред рдЪрдпрдирд┐рдд рдХрдерди рд╣рдореЗрдВ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдкрд╣рд▓реЗ рдХреНрдпрд╛ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред
рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж <-ctx.Done()
, рдХреЗрд╕ case <-ctx.Done():
рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреИрд╕реЗ рд╣реА рдРрд╕рд╛ рд╣реЛрддрд╛ рд╣реИ, рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХрд╛рд░реНрдп рдХреЛ рдмрд╛рдзрд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рд╡рд╛рдкрд╕реА рдХреА рддреИрдпрд╛рд░реА рдХрд░рдиреА рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдХрд┐рд╕реА рднреА рдЦреБрд▓реЗ рдХрдиреЗрдХреНрд╢рди рдХреЛ рдмрдВрдж рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреЛ рдореБрдХреНрдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рд▓реМрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдРрд╕реЗ рд╕рдордп рд╣реЛрддреЗ рд╣реИрдВ рдЬрдм рд╕рдВрд╕рд╛рдзрдиреЛрдВ рдХреА рд░рд┐рд╣рд╛рдИ рдореЗрдВ рджреЗрд░реА рд╣реЛ рд╕рдХрддреА рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рдлрд╛рдИ рд▓рдЯрдХреА рд╣реБрдИ рд╣реИред рдЖрдкрдХреЛ рдЗрд╕реЗ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЗрд╕ рдЦрдВрдб рдХрд╛ рдЕрдиреБрд╕рд░рдг рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдЙрджрд╛рд╣рд░рдг рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ рдХрд╛рд░реНрдпрдХреНрд░рдо рд╣реИ рдЬреЛ рдЯрд╛рдЗрдордЖрдЙрдЯ рдФрд░ рдкреВрд░реНрд╡рд╡рдд рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИред
// , - // , - func sleepRandomContext(ctx context.Context, ch chan bool) { // (. .: ) // // , defer func() { fmt.Println("sleepRandomContext complete") ch <- true }() // sleeptimeChan := make(chan int) // // go sleepRandom("sleepRandomContext", sleeptimeChan) // select select { case <-ctx.Done(): // , // , - // , ( ) // - , // , // fmt.Println("Time to return") case sleeptime := <-sleeptimeChan: // , fmt.Println("Slept for ", sleeptime, "ms") } }
рдЙрджрд╛рд╣рд░рдг
рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рджреЗрдЦрд╛, рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдорджрдж рд╕реЗ рдЖрдк рд╕рдордп рд╕реАрдорд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рд░рджреНрдж рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рднреА рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рднреА рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ рдХрд┐ рдЖрдкрдХреЛ рдЕрдкрдирд╛ рдХрд╛рдо рдкреВрд░рд╛ рдХрд░рдиреЗ рдФрд░ рд╡рд╛рдкрд╕реА рдХреЛ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
main
рд╕рдорд╛рд░реЛрд╣:
- рдПрдХ рд░рджреНрдж рд╕рдорд╛рд░реЛрд╣ рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИ
- рдПрдХ рдЕрдирд┐рдпрдВрддреНрд░рд┐рдд рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж рд░рджреНрдж рдлрд╝рдВрдХреНрд╢рди рдХреЛ рдХреЙрд▓ рдХрд░рддрд╛ рд╣реИ
doWorkContext
рдлрд╝рдВрдХреНрд╢рди:
- рдПрдХ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрдн рдмрдирд╛рддрд╛ рд╣реИ
- рдЬрдм рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рдХреЙрд▓ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рд╕рдВрджрд░реНрдн рд░рджреНрдж рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЯрд╛рдЗрдордЖрдЙрдЯ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдпрд╛ doWorkContext рдЕрдкрдиреЗ рдХреЙрд▓ рдХреЛ рд░рджреНрдж рдХрд░рддрд╛ рд╣реИред
- рдХреБрдЫ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрд░реЛрдЗрди рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рд╕рдВрджрд░реНрдн рдЧреБрдЬрд░рддрд╛ рд╣реИ
- рдЧреЛрд░реЛрдЗрдЯрд┐рди рдХреЗ рдкреВрд░рд╛ рд╣реЛрдиреЗ рдпрд╛ рдореБрдЦреНрдп рд╕реЗ рд░рджреНрдж рдХрд┐рдП рдЬрд╛рдиреЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХрд╛ рдЗрдВрддрдЬрд╛рд░, рдЬреЛ рднреА рдкрд╣рд▓реЗ рд╣реЛ
sleepRandomContext
рдлрдВрдХреНрд╢рди:
- рдХреБрдЫ рдзреАрдореА рдЧрддрд┐ рд╕реЗ рдХрд╛рд░реНрдп рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрд░реЛрдЗрди рд▓реЙрдиреНрдЪ рдХрд░рддрд╛ рд╣реИ
- рд╕рдорд╛рдкреНрдд рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП рдЧреЛрд░реЛрдЗрди рдХрд╛ рдЗрдВрддрдЬрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдпрд╛
- рдореБрдЦреНрдп рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд░рджреНрдж рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджрд░реНрдн рдХреЗ рд▓рд┐рдП рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреА рдЬрд╛ рд░рд╣реА рд╣реИ, рд╕рдордп рд╕рдорд╛рдкреНрдд рд╣реЛ рдЧрдпрд╛ рд╣реИ, рдпрд╛ рдЕрдкрдиреА рд╕реНрд╡рдпрдВ рдХреА рдХреЙрд▓ рд░рджреНрдж рдХрд░реЗрдВ
sleepRandom
рд╕рдорд╛рд░реЛрд╣:
- рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдордп рдкрд░ рд╕реЛ рдЬрд╛рддрд╛ рд╣реИ
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рд╕рдордп рдХрд╛ рдЕрдиреБрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд▓реАрдк рдореЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ, рдЖрдк рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд╕рдлрд╛рдИ рдХреА рд╢реБрд░реБрдЖрдд рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕рдВрдХреЗрдд рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ рдЪреИрдирд▓ рд╕реЗ рдкреБрд╖реНрдЯрд┐ рдХреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╕рдлрд╛рдИ рдкреВрд░реА рд╣реЛ рдЧрдИ рд╣реИред
рд╕реИрдВрдбрдмреЙрдХреНрд╕ (рдРрд╕рд╛ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рдореИрдВ рдЬрд┐рд╕ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ рд╡рд╣ рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рд░реВрдк рд╕реЗ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реИред рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХрдВрдкреНрдпреВрдЯрд░ рдХреЛ рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рд╕реНрдерд╛рдиреАрдп рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдпрд╣ рдкреНрд░рдпрд╛рд╕ рдХрд░реЗрдВ)
тЖТ рдЬреАрдердм
package main import ( "context" "fmt" "math/rand" "Time" ) // func sleepRandom(fromFunction string, ch chan int) { // defer func() { fmt.Println(fromFunction, "sleepRandom complete") }() // // , // ┬л┬╗ seed := time.Now().UnixNano() r := rand.New(rand.NewSource(seed)) randomNumber := r.Intn(100) sleeptime := randomNumber + 100 fmt.Println(fromFunction, "Starting sleep for", sleeptime, "ms") time.Sleep(time.Duration(sleeptime) * time.Millisecond) fmt.Println(fromFunction, "Waking up, slept for ", sleeptime, "ms") // , if ch != nil { ch <- sleeptime } } // , // , - func sleepRandomContext(ctx context.Context, ch chan bool) { // (. .: ) // // , defer func() { fmt.Println("sleepRandomContext complete") ch <- true }() // sleeptimeChan := make(chan int) // // go sleepRandom("sleepRandomContext", sleeptimeChan) // select select { case <-ctx.Done(): // , // , doWorkContext // doWorkContext main cancelFunction // , - // , ( ) // - , // , // fmt.Println("sleepRandomContext: Time to return") case sleeptime := <-sleeptimeChan: // , fmt.Println("Slept for ", sleeptime, "ms") } } // , // // , main func doWorkContext(ctx context.Context) { // - // 150 // , , 150 ctxWithTimeout, cancelFunction := context.WithTimeout(ctx, time.Duration(150)*time.Millisecond) // defer func() { fmt.Println("doWorkContext complete") cancelFunction() }() // // , // , ch := make(chan bool) go sleepRandomContext(ctxWithTimeout, ch) // select select { case <-ctx.Done(): // , // , main cancelFunction fmt.Println("doWorkContext: Time to return") case <-ch: // , fmt.Println("sleepRandomContext returned") } } func main() { // background ctx := context.Background() // ctxWithCancel, cancelFunction := context.WithCancel(ctx) // // defer func() { fmt.Println("Main Defer: canceling context") cancelFunction() }() // - // , go func() { sleepRandom("Main", nil) cancelFunction() fmt.Println("Main Sleep complete. canceling context") }() // doWorkContext(ctxWithCancel) }
рдиреБрдХрд╕рд╛рди
рдпрджрд┐ рдлрд╝рдВрдХреНрд╢рди рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рддреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рд░рджреНрджреАрдХрд░рдг рд╕реВрдЪрдирд╛рдУрдВ рдХреЛ рдареАрдХ рд╕реЗ рд╣реИрдВрдбрд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, exec.CommandContext
рддрдм рддрдХ рд░реАрдб рдЪреИрдирд▓ рдХреЛ рдмрдВрдж рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдХрдорд╛рдВрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ ( Github ) рджреНрд╡рд╛рд░рд╛ рдмрдирд╛рдП рдЧрдП рд╕рднреА рдХрд╛рдВрдЯреЗ рдХреЛ рдкреВрд░рд╛ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ, рдпрд╛рдиреА рдХрд┐ рд╕рдВрджрд░реНрдн рдХреЛ рд░рджреНрдж рдХрд░рдиреЗ рд╕реЗ рддреБрд░рдВрдд рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╡рд╛рдкрд╕ рдирд╣реАрдВ рд▓реМрдЯрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЕрдЧрд░ cmd.Wait () рд╕реЗ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХрд░реЗрдВред рдЬрдм рддрдХ рдмрд╛рд╣рд░реА рдХрдорд╛рдВрдб рдкреВрд░реА рдкреНрд░рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рд╕рднреА рдХрд╛рдВрдЯреЗред
рдпрджрд┐ рдЖрдк рдЕрдзрд┐рдХрддрдо рд░рдирдЯрд╛рдЗрдо рдХреЗ рд╕рд╛рде рдЯрд╛рдЗрдордЖрдЙрдЯ рдпрд╛ рд╕рдордп рд╕реАрдорд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рд╕рдордп рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд╛рдЗрдордЖрдЙрдЯ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред time.After
ред
рд╕рд░реНрд╡реЛрддреНрддрдо рдЕрднреНрдпрд╛рд╕
- рд╕рдВрджрд░реНрднред рдмреИрдХрдЧреНрд░рд╛рдЙрдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреЗрд╡рд▓ рдЙрдЪреНрдЪрддрдо рд╕реНрддрд░ рдкрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рд╕рднреА рд╡реНрдпреБрддреНрдкрдиреНрди рд╕рдВрджрд░реНрднреЛрдВ рдХреА рдЬрдбрд╝ рдХреЗ рд░реВрдк рдореЗрдВред
- рд╕рдВрджрд░реНрднред TODO рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП рдЬрдм рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рди рд╣реЛрдВ рдХрд┐ рдХреНрдпрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реИ, рдпрд╛ рдпрджрд┐ рд╡рд░реНрддрдорд╛рди рдлрд╝рдВрдХреНрд╢рди рднрд╡рд┐рд╖реНрдп рдореЗрдВ рд╕рдВрджрд░реНрдн рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛ред
- рд╕рдВрджрд░реНрдн рд░рджреНрдж рдХрд░рдиреЗ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХреА рдЬрд╛рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЗрди рдХрд╛рд░реНрдпреЛрдВ рдХреЛ рд╕реНрдкрд╖реНрдЯ рдФрд░ рдмрд╛рд╣рд░ рдирд┐рдХрд▓рдиреЗ рдореЗрдВ рдХреБрдЫ рд╕рдордп рд▓рдЧ рд╕рдХрддрд╛ рд╣реИред
- рд╕рдВрджрд░реНрдн.рд╡рд╛рдпреБ рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрдерд╛рд╕рдВрднрд╡ рд╕рдВрдпрдо рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╡реИрдХрд▓реНрдкрд┐рдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХреЛ рдкрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдпрд╣ рдПрдкреАрдЖрдИ рдХреЛ рд╕рдордЭ рд╕реЗ рдмрд╛рд╣рд░ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдЬрдиреНрдо рджреЗ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред
- рдПрдХ рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рд╕рдВрджрд░реНрднреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рди рдХрд░реЗрдВ, рдЙрдиреНрд╣реЗрдВ рдХрд╛рд░реНрдпреЛрдВ рдореЗрдВ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд░реЗрдВ, рдЕрдзрд┐рдорд╛рдирддрдГ рдкрд╣рд▓реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВред
- рдПрдХ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрднреА рднреА рд╢реВрдиреНрдп рд╕рдВрджрд░реНрдн рди рджреЗрдВред рдпрджрд┐ рд╕рдВрджреЗрд╣ рд╣реИ, рддреЛ TODO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
Context
рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдПрдХ рд░рджреНрдж рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рдирд╣реАрдВ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдХреЗрд╡рд▓ рдлрд╝рдВрдХреНрд╢рди рдЬреЛ рд╕рдВрджрд░реНрдн рдХреЛ рдкреНрд░рдХрдЯ рдХрд░рддрд╛ рд╣реИ, рдЙрд╕реЗ рд░рджреНрдж рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред
рдЕрдиреБрд╡рд╛рджрдХ рд╕реЗ
рд╣рдорд╛рд░реА рдХрдВрдкрдиреА рдореЗрдВ, рд╣рдо рдЖрдВрддрд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╡рд┐рдХрд╕рд┐рдд рдХрд░рддреЗ рд╕рдордп рд╕рдВрджрд░реНрдн рдкреИрдХреЗрдЬ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░рд╕рдВрдЧ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд╛рдордХрд╛рдЬ рдХреЗ рд▓рд┐рдП рдРрд╕реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдЕрддрд┐рд░рд┐рдХреНрдд рддрддреНрд╡реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬреИрд╕реЗ:
- рд▓реЙрдЧрд┐рдВрдЧ
- рдЖрд╡реЗрджрди рд╕рдорд╛рдкреНрддрд┐, рдкреБрдирдГ рд▓реЛрдб рдФрд░ рд▓реЙрдЧреЛрдЯреЗрдЯ рдХреЗ рд▓рд┐рдП рд╕рд┐рдЧреНрдирд▓ рдкреНрд░реЛрд╕реЗрд╕рд┐рдВрдЧ
- Pid рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
- рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВ
- рдФрд░ рдЕрдиреНрдп
рдЗрд╕рд▓рд┐рдП, рдХреБрдЫ рдмрд┐рдВрджреБ рдкрд░, рд╣рдордиреЗ рдЕрдкрдиреЗ рд╕рднреА рдЕрдиреБрднрд╡ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рд╕рд╣рд╛рдпрдХ рдкреИрдХреЗрдЬ рдмрдирд╛рдП рдЬреЛ рд▓реЗрдЦрди рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЛ рдмрд╣реБрдд рд╕рд░рд▓ рдХрд░рддреЗ рд╣реИрдВ (рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдРрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЬрд┐рдирдХреЗ рдкрд╛рд╕ рдПрдкреАрдЖрдИ рд╣реИ)ред рд╣рдордиреЗ рдЕрдкрдиреЗ рд╡рд┐рдХрд╛рд╕ рдХреЛ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдбреЛрдореЗрди рдореЗрдВ рдкреЛрд╕реНрдЯ рдХрд┐рдпрд╛ рд╣реИ рдФрд░ рдХреЛрдИ рднреА рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдРрд╕реА рд╕рдорд╕реНрдпрд╛рдУрдВ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд▓рд┐рдП рдХреБрдЫ рд▓рд┐рдВрдХ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╣реИрдВ:
рд╣рдорд╛рд░реЗ рдмреНрд▓реЙрдЧ рдкрд░ рдЕрдиреНрдп рд▓реЗрдЦ рднреА рдкрдврд╝реЗрдВ: