рдЖрдИ рд▓рд╡ рдЧреЛ, рдЖрдИ рд▓рд╡ рдпреВ рд╕реНрддреБрддрд┐ рдЗрдЯ (рдпрд╣ рднреА рд╣реЛрддрд╛ рд╣реИ, рдореИрдВ рдПрдХ рдЧрд╛рд▓рд┐рдпрд╛ рдмрдХрддрд╛ рд╣реВрдВ), рдореБрдЭреЗ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд▓реЗрдЦ рдмрд╣реБрдд рдкрд╕рдВрдж рд╣реИрдВред рдореИрдВрдиреЗ рд▓реЗрдЦ "
рдЧреЛ: рдкреНрд░реЛрдбрдХреНрд╢рди рдореЗрдВ рджреЛ рд╕рд╛рд▓ " рдкрдврд╝рд╛, рдлрд┐рд░ рдЯрд┐рдкреНрдкрдгреА рдХреАред рдпрд╣ рд╣рдм рдкрд░ рд╕реНрдкрд╖реНрдЯ рд╣реЛ рдЧрдпрд╛ - рдЖрд╢рд╛рд╡рд╛рджреА! рд╡реЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдореЗрдВ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдЧреЛ рдЕрдкрдиреЗ рд╢реЗрдбрдпреВрд▓рд░ рдФрд░ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рдХреЙрд▓ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рд╣реА рдзрд╛рдЧреЗ рдкрд░ рдЪрд▓рддрд╛ рд╣реИред (рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдХреЛ рдорд▓реНрдЯреАрдереНрд░реЗрдбрд┐рдВрдЧ рдФрд░ рд╕рдорд╛рдирддрд╛ рдХреА рднрд╛рд╡рдирд╛ рд╣реИред) рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЪреИрдирд▓ рдмрд╣реБрдд рддреЗрдЬрд╝реА рд╕реЗ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЧреЛ рдХреЛ 2 рдпрд╛ рдЕрдзрд┐рдХ рдереНрд░реЗрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд╣рддреЗ рд╣реИрдВ, рддреЛ рдЧреЛ рд▓реЙрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрддрд╛ рд╣реИ рдФрд░ рдЪреИрдирд▓ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдЧрд┐рд░ рд╕рдХрддрд╛ рд╣реИред рдореИрдВ рдЪреИрдирд▓реЛрдВ рдХреЗ рдЙрдкрдпреЛрдЧ рдореЗрдВ рдЦреБрдж рдХреЛ рд╕реАрдорд┐рдд рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рдЕрдзрд┐рдХрд╛рдВрд╢ рддреАрд╕рд░реЗ рдкрдХреНрд╖ рдХреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╣рд░ рдЕрд╡рд╕рд░ рдкрд░ рдЪреИрдирд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕рд▓рд┐рдП, рдЧреЛ рдХреЛ рдПрдХрд▓ рдереНрд░реЗрдб рдХреЗ рд╕рд╛рде рдЪрд▓рд╛рдирд╛ рдЕрдХреНрд╕рд░ рдкреНрд░рднрд╛рд╡реА рд╣реЛрддрд╛ рд╣реИ, рдЬреИрд╕рд╛ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
channel01.go
package main import "fmt" import "time" import "runtime" func main() { numcpu := runtime.NumCPU() fmt.Println("NumCPU", numcpu)
users-iMac:channel user$ go run channel01.go NumCPU 4 23.901 24.189 23.957 24.072 24.001 23.807 24.039 23.854 23.798 24.1 Total: 239.718 0
рдЕрдм рд▓рд╛рдЗрдиреЛрдВ рдХреЛ рдЯрд┐рдкреНрдкрдгреА рдХрд░рдХреЗ рд╕рднреА рдЧреБрдард▓реА рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░рддреЗ рд╣реИрдВред
runtime.GOMAXPROCS(numcpu)
users-iMac:channel user$ go run channel01.go NumCPU 4 543.092 534.985 535.799 533.039 538.806 533.315 536.501 533.261 537.73 532.585 Total: 5359.113 0
20 рдЧреБрдирд╛ рдзреАрдореА? рдХреИрдЪ рдХреНрдпрд╛ рд╣реИ? рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдЪреИрдирд▓ рдХрд╛ рдЖрдХрд╛рд░ 1 рд╣реИред
ch1 := make(chan int)
100 рд░рдЦреЛред
ch1 := make(chan int, 100)
рдкрд░рд┐рдгрд╛рдо 1 рд╕реНрдЯреНрд░реАрдо
users-iMac:channel user$ go run channel01.go NumCPU 4 9.704 9.618 9.178 9.84 9.869 9.461 9.802 9.743 9.877 9.756 Total: 0 96.848
4 рд╕реНрдЯреНрд░реАрдо рдкрд░рд┐рдгрд╛рдо
users-iMac:channel user$ go run channel01.go NumCPU 4 17.046 17.046 16.71 16.315 16.542 16.643 17.69 16.387 17.162 15.232 Total: 0 166.77300000000002
рдХреЗрд╡рд▓ рджреЛ рдмрд╛рд░ рдзреАрдорд╛, рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣рдореЗрд╢рд╛ рд╕рдВрднрд╡ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред
рдЪреИрдирд▓ рдЪреИрдирд▓ рдЙрджрд╛рд╣рд░рдг
package main import "fmt" import "time" import "runtime" func main() { numcpu := runtime.NumCPU() fmt.Println("NumCPU", numcpu)
рдкрд░рд┐рдгрд╛рдо 1 рд╕реНрдЯреНрд░реАрдо
users-iMac:channel user$ go run channel03.go NumCPU 4 1041.489
4 рд╕реНрдЯреНрд░реАрдо рдкрд░рд┐рдгрд╛рдо
users-iMac:channel user$ go run channel03.go NumCPU 4 11170.616
рдЗрд╕рд▓рд┐рдП, рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ 8 рдХреЛрд░ рд╣реИрдВ рдФрд░ рдЖрдк рдЧреЛ рдкрд░ рд╕рд░реНрд╡рд░ рд▓рд┐рдЦрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдХреЗрд╡рд▓ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХреЛ рд╕рдорд╛рдирд╛рдВрддрд░ рдХрд░рдиреЗ рдореЗрдВ рдЧреЛ рдкрд░ рдирд┐рд░реНрднрд░ рдирд╣реАрдВ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдпрд╛ рд╢рд╛рдпрдж 8 рдПрдХрд▓-рдереНрд░реЗрдбреЗрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рд╢реБрд░реВ рдХрд░реЗрдВ, рдФрд░ рдЙрдирд╕реЗ рдкрд╣рд▓реЗ рдПрдХ рдмреИрд▓реЗрдВрд╕рд░ рд╣реИ рдЬрд┐рд╕реЗ рдЧреЛ рдкрд░ рднреА рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЙрддреНрдкрд╛рджрди рдореЗрдВ рдПрдХ рд╕рд░реНрд╡рд░ рдерд╛, рдЬреЛ рдПрдХрд▓-рдХреЛрд░ рд╕рд░реНрд╡рд░ рд╕реЗ 4x рдкрд░ рд╕реНрд╡рд┐рдЪ рдХрд░рддреЗ рд╕рдордп, 10% рдХрдо рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рд▓рдЧрд╛ред
рдЗрди рдирдВрдмрд░реЛрдВ рдХрд╛ рдХреНрдпрд╛ рдорддрд▓рдм рд╣реИ? рд╣рдореЗрдВ рдПрдХ рд╕рдВрджрд░реНрдн рдореЗрдВ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рдХрд╛рд░реНрдп рдХреЗ рд╕рд╛рде рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝рд╛ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рджреЗрддреЗ рд╣реБрдП: 1, 2, 3, 4, 5 ... рд╢рд╛рдпрдж рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓) рдФрд░ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3000 рдЕрдиреБрд░реЛрдзреЛрдВ рдХрд╛ рдкреНрд░рджрд░реНрд╢рди рдореБрдЦреНрдп рд░реВрдк рд╕реЗ рдЪреИрдирд▓реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕реАрдорд┐рдд рд╣реИред рдзрд╛рдЧреЗ рдФрд░ рдХреЛрд░ рдХреЗ рдЕрд▓рд╛рд╡рд╛ рдХреЗ рд╕рд╛рде, рдкреНрд░рджрд░реНрд╢рди рдЙрддреНрд╕рд╛рд╣ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдВрдЫрд┐рдд рд░реВрдк рд╕реЗ рдирд╣реАрдВ рдмрдврд╝рддрд╛ рд╣реИред рдЧреЛ рдХреЗ рд▓рд┐рдП рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб 3000 рдЕрдиреБрд░реЛрдз рдЖрдзреБрдирд┐рдХ рдЙрдкрдХрд░рдгреЛрдВ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рд╕реАрдорд╛ рд╣реИред
рд░рд╛рдд рдХрд╛ рдЕрдкрдбреЗрдЯ: рдореИрдВ рдХреИрд╕реЗ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддрд╛ рд╣реВрдВ
рд▓реЗрдЦ "
рдЧреЛ: рдЯреВ рдЗрдпрд░реНрд╕ рдЗрди рдкреНрд░реЛрдбрдХреНрд╢рди " рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдиреЗ рдореБрдЭреЗ рдЗрд╕ рд▓реЗрдЦ рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд░реЗрд░рд┐рдд рдХрд┐рдпрд╛, рд▓реЗрдХрд┐рди рдЗрд╕ рдЯрд┐рдкреНрдкрдгреА рдиреЗ рдкрд╣рд▓реЗ рдХреА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдХреЛ рдкрд╛рд░ рдХрд░ рд▓рд┐рдпрд╛ред
рд╕рд╛рдЗрдмрд░рдЧреНрд░реАрдЧ
рд░рдХреНрд╖рдХ рдиреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЕрдиреБрдХреВрд▓рди рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рд░рдЦрд╛ред рдкрд╣рд▓реЗ рд╕реЗ рд╣реА 8 рдЕрдиреНрдп habrazhitelami рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХрд┐рдпрд╛ рдЧрдпрд╛ред рдореБрдЭреЗ рдирд╣реАрдВ рдкрддрд╛ рдХрд┐ рд╡реЗ рдХреЛрдб рдкрдврд╝рддреЗ рд╣реИрдВ рдпрд╛ рд╢рд╛рдпрдж рд╡реЗ рдЧреЛрддрд╛рдЦреЛрд░ рд╣реИрдВ рдФрд░ рд╡реЗ рд╕рдм рдХреБрдЫ рд╕рд╣рдЬ рд░реВрдк рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдордЭрд╛рдКрдВрдЧрд╛ред рддреЛ рд▓реЗрдЦ рдЕрдзрд┐рдХ рд╕рдВрдкреВрд░реНрдг рдФрд░ рдЬрд╛рдирдХрд╛рд░реАрдкреВрд░реНрдг рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
рдпрд╣рд╛рдБ рдХреЛрдб рд╣реИ:
package main import "fmt" import "time" import "runtime" func main() { numcpu := runtime.NumCPU() fmt.Println("NumCPU", numcpu)
рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рд╕рд╛рд░ рдХреНрдпрд╛ рд╣реИ?
1. рдЪреИрдирд▓ ch3 рдЬреЛрдбрд╝рд╛ рдЧрдпрд╛ред рдпрд╣ рдЪреИрдирд▓ рджреВрд╕рд░реЗ рдЧреЛрд░реВрдЯрд┐рди рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИ, рдЬрдм рддрдХ рдХрд┐ рдкрд╣рд▓рд╛ рдЧреЛрд░реБрдЯрд┐рди рдЦрддреНрдо рдирд╣реАрдВ рд╣реЛ рдЬрд╛рддрд╛ред
2. рдЪреВрдБрдХрд┐ рджреВрд╕рд░рд╛ gorutin рдЪреИрдирд▓ ch1 рд╕реЗ рдирд╣реАрдВ рдкрдврд╝рддрд╛ рд╣реИ, рдпрд╣ рднрд░рдиреЗ рдХреЗ рджреМрд░рд╛рди рдкрд╣рд▓реЗ gorutin рдХреЛ рдмреНрд▓реЙрдХ рдХрд░рддрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП, ch1 рдХреЛ рдЖрд╡рд╢реНрдпрдХ 1,000,000 рддрдХ рдмрдврд╝рд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ
рдпрд╣реА рд╣реИ, рдХреЛрдб рдЕрдм рд╕рдорд╛рдирд╛рдВрддрд░ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЪреИрдирд▓ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдФрд░ рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ рдпрд╣ рдХреЛрдб рджреВрд╕рд░реЗ рдХреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИред рдЗрд╕ рдХреЛрдб рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдХреЛрдИ "рдПрди рдХреЗ рдПрдХ рдХрд╛рд░рдХ рджреНрд╡рд╛рд░рд╛ рдЖрджрд░реНрд╢ рддреНрд╡рд░рдг" рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
рдореБрдЦреНрдп рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рдЗрд╕ рддрд░рд╣ рдХреЗ рдПрдХ рдХреЛрдб рдХреЗрд╡рд▓ рдбреЗрдЯрд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд┐рдд рд░рд╛рд╢рд┐ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░реЗрдВрдЧреЗ рдФрд░ рд▓рдЧрд╛рддрд╛рд░ рдХрд╛рдо рдХрд░рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдирд╣реАрдВ рд╣реИ, рдЬрд╛рдирдХрд╛рд░реА рдХреЛ рдирд┐рд░реНрдЬреАрд╡ рд░реВрдк рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдПред
рдЕрдкрдбреЗрдЯ 2: рдЧреЛ 1.1.2 рдкрд░ рдЯреЗрд╕реНрдЯ
рдмрдлрд░ 1 рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ рдПрдХ (channel01.go)
ch1 := make(chan chan int, 1)
1 рдзрд╛рдЧрд╛
go runchannel01.go NumCPU 4 66.0038 66.0038 67.0038 66.0038 67.0038 66.0038 65.0037 67.0038 67.0039 76.0043 Total: 0 673.0385000000001
4 рдзрд╛рдЧреЗ
go run channel01.go NumCPU 4 116.0066 186.0106 112.0064 117.0067 175.01 115.0066 114.0065 148.0084 133.0076 153.0088 Total: 0 1369.0782
рдирд┐рд╖реНрдХрд░реНрд╖: рдмрд╣реБрдд рдмреЗрд╣рддрд░ред рдХреНрдпреЛрдВ рдмрдлрд░ 1 рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдореБрд╢реНрдХрд┐рд▓ рд╣реИ, рд▓реЗрдХрд┐рди рд╢рд╛рдпрдж рдРрд╕реЗ рдмрдлрд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡реЗрджрди рд╣реИред
рдмрдлрд░ 100 рдХреЗ рд╕рд╛рде рдЯреЗрд╕реНрдЯ рдирдВрдмрд░ рдПрдХ (channel01.go)
ch1 := make(chan chan int, 100)
1 рдзрд╛рдЧрд╛
go run channel01.go NumCPU 4 16.0009 17.001 16.0009 16.0009 16.0009 16.0009 17.001 16.0009 17.001 16.0009 Total: 0 163.00930000000002
4 рдзрд╛рдЧреЗ
go runchannel01.go NumCPU 4 66.0038 66.0038 67.0038 66.0038 67.0038 66.0038 65.0037 67.0038 67.0039 76.0043 Total: 0 673.0385000000001
рдирд┐рд╖реНрдХрд░реНрд╖: рд╕рдВрд╕реНрдХрд░рдг 1.0.2 рд╕реЗ рджреЛ рдЧреБрдирд╛ рдмрджрддрд░
рдкрд░реАрдХреНрд╖рдг рд╕рдВрдЦреНрдпрд╛ рджреЛ (channel03.go)
1 рдзрд╛рдЧрд╛
go run channel03.go NumCPU 4 1568.0897
4 рдзрд╛рдЧреЗ
go run channel03.go NumCPU 4 12119.6932
рд╕рдВрд╕реНрдХрд░рдг 1.0.2 рдХреЗ рд▓рдЧрднрдЧ рд╕рдорд╛рди, рд▓реЗрдХрд┐рди рдереЛрдбрд╝рд╛ рдмреЗрд╣рддрд░ред 1: 8 рдмрдирд╛рдо 1:10