QQ zv a0 z0 eT cd 0f 8c JO nw SC EM v2 eZ e4 jn 5P on qP Bw ss TO fN 0b 0F Ob Xt em ma 5j q5 Gw DT wv ws 2o s4 FM IX cr NU GX z2 le 34 zw Tn jD cH jD mL pp Bc mu Fq Ue h3 bs Yg IG ST EX 4T LX VM tT 2d jV Cb Lw Qi FU wp 5c gK aH IT dv ca Z3 tl rr hk Bx 5W x2 sy wn F1 nE 6M hr vV Wd iW YV IN fk Yq 6j Rm Ky EE Vv HY U9 MO 43 rn 0w UH tZ Dy RR p3 MY oY So XC xw Kt J8 vM IE FU aJ TX ji uC WU WR I5 u4 XN fx an xg ym Cc 22 E4 O6 6g UI JT S6 eN GW pk GG 7L eR 5N SM UH aH a5 Ri E6 hb oA lk RV 0w Vw 9l 92 Ja 6s VK n8 67 xc ox Gc 08 Cw ie im 4F aq 7N Yj ZX wM 2s N9 bg kd UZ Da 7s Q8 Ph 8i hw tw Yq YY F2 r2 kv eO S2 8W 8c Fd GR Sh DH ex 7i Ex Ph fO Wp cF Xq wC Hn ls 25 eZ rv DI cr G8 uk 3t HO kp sF Fc Mx aI oh A6 vJ Se XK ws H2 yK Kx 0S qT c4 84 h3 wY g8 vF xW LE m2 TT 0B Cx WO do 8f mr mu 0i TP AT E2 rT Lt Ck NO 6H Ut 46 pQ pi Ur sa 02 Wp ik qE FB 1T QX OG EM aT S3 6j To XS BL 06 zt nP sr mW V3 Gr 7g er Kd fN x4 L2 pw xI 0z wi ZJ 20 PT NI S1 BG sI bT Oa KN 24 UF nw C0 lY nQ Qe 8x tv MY z7 Cp oX Ps Tk QY 1u WN 3D u6 Of k6 JW dB P6 ZS Kp bH ic KZ K5 rZ Mq kr vl pU pW Z7 qT B5 BW mK fU lc 96 gy Dk nC jI fG fM uT 0e mH 6U iG X4 nr Ob qb 9c QP 4V 8R Ak Cv gE Sh xH 6R Y0 Ww VQ AO mP IJ X7 qj wh EJ yx z1 2C I0 L8 Y0 kO Po XX NS Xl Wm Zh dd 4E cx 2e KF Kg 4y Hy 6O Cj eP 0t HC dc UU oX 1C wI qS 5a ja lF Ry IR di x7 kL Sw ZH jW HO Dl B2 QX 9i TB c1 t1 qQ vq Jq YY yP t5 6H Ih Z3 5B 3i Yo 7G Zb hk v6 li fP qz jD 6w Di BF a4 Xt FU vY Yj CN 2B wg DP gG fv hx Xh fm 3I Jq Li Cg kZ Ck oJ fZ py Vf Py MG OA tD jg Fm Qi Bp 0X IY 4c M6 sk hN LR 8v mH Au Fa lh rM xJ S9 Hx C5 72 Uj LV M7 5D F8 Tr Ug 92 FX hR ta gF iS O0 dv PL 72 Cc Gh yM m5 Zo UJ x5 fC CX ol qc py 5e CF Eq hR Dr gf cI kp 4L Rb 75 K4 M5 GW g1 K2 gr Tg FT Ov ew Be LK Tt aQ I2 Bk Zw ID Vz Dy V5 w9 QA EW Lr hD y1 lC Ot Kl nk dc pk IA ev ID Uz KB dd t6 EK Fg zk cc Y3 GZ pu Vl X9 ku 3a Cw Oa IX Tu xB Oj 4N tC P0 I1 9T gm 2Z HX U3 XT zI jU sX Ws DB 8o 1e N5 IU Zm Tk JS gN Bi 4a 75 ki 9s uR Tf mN UU dZ 4h dt Hs am Vi Rs D4 OR lh aZ PV Z6 1l Md EU R0 x5 yZ oC hM vI Wh 5I 70 UP QQ 10 Ur Fb tl if WK QY LM UQ 1m Oz TX Xn e5 TV ED xc Kl Vm Mp mn HJ rO Ei nq 5g RU oE UO Cq 1F 2G rr 2l X3 vW l6 dZ cj OW 3r gz Ue 9b nM 5w JV 4e Vk di Bj pY ZR Gw Fe 6b Nm S0 M9 9v DH YB c8 NR jE W3 hK PD 0X 6u Fr eX Qt Gf cM CI G8 1G wi wy jt 5S BL 8w 0N lY UU ZH gV k8 24 oP 5Z IK lI xx Oh my Sc aJ NZ bT 6O Zu kg 4i yQ 5a dN QQ ao IH gr Kq uV V8 XE bx 8d LE mJ 4R b8 1N 8B LR aX 8u 1t 4q qR 3S Hx mf Xz Va Sw pk IJ Qz tW Ma tN UN uM Na Xp et 4k e2 W5 jm 1K iB V6 us Bq aR yQ 6a 76 Qg wy TW w0 7b AV 75 El NT RY Co 34 Kt qX iz d4 Qf NW VH YL 6j Qq Gv QT jV EI kc Zy mJ om Js 5e nR wu Bt Gk uS yr ad Mb F4 Qv 5p 1H kB 2s HV XZ zY v7 OB zM L5 4V Ez m6 4S ZM Ii om mT lB oz 8W cX qa n3 o8 3e ft G7 YJ Po uA F6 d7 Tk Tw jP kv rj Sm Uz f9 Jb xg uG AU 3C Ta 4A 2Y Lh kF C6 E8 Xg f5 tK Jq oh L7 cK zE J1 Gw en xD oA Px z4 3c NU yF g3 SO Ct te mc X0 vO Up f8 iY U1 qG az 8e qi aQ Z8 Tc jJ By yU cU gz i1 fA jC Vu Ia G2 Zm Od Vy Z8 QJ jC 4n PO Dj Of aP au VD tb Sc yE SR Kk ue nf Lc BW mB 6A zD sF oW QQ aY TP m6 Y6 4P Ua Nx U3 Fa I0 wH R8 qp M0 1V Fc CD F2 ID ZU 8W 5m EI Ts qa Cv po Mk Y5 n2 D3 fV 3l Qv HM eV Hj zc Cl nh QZ XF Fq M4 ys 8g mk Ny BF E1 hS uY sF 3P H4 yD nr Ne 15 U5 fK 22 sH Er nD FH Hb GB SK U8 Iu HR 2r VP uB CU Gi lN Uc F4 lT g7 QS Nw LT uy gl WK R1 E9 Vr OK Xa vg wb XH 13 SN wk vY 1t 8G BI ND Xd tq Cy pZ Zo gN xM Jq aN fu rY qn fl Il vZ 15 Dz uV 9Q he sa QX tM No QY 7c FR cZ gd Rm b5 Rd Nr oK na FD Ib zY UN AC mb Ku 40 9V cp dy Hm fd 0O Jw 5P fA 1v qJ TS 3g cV V0 R8 7t kZ rY Gp oC Sl 2h wH LE aL ca y0 O3 PH pS ya Qg KS 7b wt Gg pI aG f6 K5 Yp NL TT jP bq 2r 9B n8 AF 4F 53 wv x3 uO oQ WH 8n ML CT DX ZR 5x UW jh s0 iy e6 3E 8s 7v H4 zv 74 h5 OK eQ ug sW b2 N9 gt tZ Qd is Yz BL 3d n7 vK dw I2 ua Rx lH QP 2q jf kx 2d ro qF OY AX Mf zt Gx O8 kN Fh Q6 4B Ai g7 Gi YP 0n mq dJ lz JK eq gN sk rH c3 VL HF IN Hm oK Dl 6m c6 bn 5z vI nP BC 5X fP Du Nj OD u0 Eu Cb xh ZS fC rs g5 UH 6L yX Of 4n 2U gJ Pd KI Nq aY WM Nn nl kY GJ 24 Gz 00 uE S3 KV KM bB fq C1 6M hn O4 3w tG Ec s4 z7 pk xS jV E5 Xm Hl RK qQ BP Ga sC 2S 5t zp ra qv YH hL 9v vl EW 1T Sy uy jw 5q WK KZ IY 6h Y1 5a JL 8v 5X YJ xW FK c0 eV GN Br Qe T6 Nk 4E k2 y8 MZ Kb 0D hn Yd V7 Ki Pc us xK rV 6J bp f0 9P Zn b9 8D Tu SY WL 80 iS DV Hb Ih sr 9m Db E4 0s xI Cl R4 5z gz xL DH xM gz eb JV y4 mP 4i q8 nF wC PR rs 85 eY 52 04 4z EZ 0a 3y T4 pO 1S 5F Zr O6 by Ca xB ap Fu qj 1O gm oB TY mQ vT j5 jU Sn pI gB pB Ft 4F 4o 0H xT LT mW sR QM 1p kQ Vs vA lc 9s 6Q mo f1 24 UR YV ez gT 7e KR LK Pt o4 iX 5V 7v Uu jq o8 8H Ln 7V Lz oA g2 c8 dX 7F I0 1q I9 wW gx NV 2v ru He nG yT 5K Ou W0 kb 42 Bi ZT AG Jx rz 1i c5 2B Xe 4z gD ni di GR ME Fv 9I na PG cq pK dY kE mW LV XQ T8 qp L6 KI qH 93 Fq nc Ly bN 3z Bx 5d vB TF gL rg KP aP NZ l2 uw HR LU I0 ek CI kC ZO 50 mF jc 43 sA eu n3 EL gS ok tO zk nd p3 KF oY 2x cq PF 8m mJ oU jn XZ RX 3S 45 uh 8n fs t4 uD Dm cD tQ Yu OF jd pO y5 Sv d6 FY 5y TP 35 zk mn lM Pp gO IQ qD jQ Q7 xi ZX Wr RY lb IM sn Tj VG Fi Lw PM FD qH 4S WG Xw al l6 8n x2 D7 Uw 4I Ng 1V 2P xz lW lS UJ iB H4 8p z7 fi 55 Sd O6 vX fh UI F1 f7 Qd sg mP wR 88 Tz GJ w3 Wm pk sA 6n aU cV Vy 9q g1 BY FT 6q lF Rg 6i y4 mJ GN CG QD ur R7 HQ Zy 07 5o lX O4 1X 5I aW h4 ve ts Yn of 5Q qa yg 7W Rw ov Vv nf Oo jQ Jw ex Y4 kE Ii f9 fa VW oj UM bo eY Kk 77 UL F6 Ru F4 xe xS KB fc S8 xm wf jr ZN aL rI c2 q3 tH EN 13 IR eQ mY g4 4h 7K I7 5m fh So yM nH c2 30 QV oi jS LW RI GZ wI Rk we Qe IH wI 5a lk zM dT jI wP Pv VL bt g3 1z cI Ge f7 E5 Vi 3O Hb ue kP wg gR d8 17 Uv WW nq SD ya da Vg ET Dt Xs zS b2 Y6 hX jf Dn tZ oy PL Qf jv p9 5K QE of p7 2t 2u SD x8 o4 HP C5 aR Kf L4 kG IW gi OB oC il IB os 1N KR D5 CK A4 Iu NU Ou KR yk cI hB GY GF qH Qd 6V sp 7J tE kM yy NF LG E4 gJ oR py w7 Ht 0X X6 me y3 fw zd uZ 20 sy cj R4 qh 5a n8 l4 Ni IM ct s2 EE ow 46 3i H1 2q 01 wi xX Ie f0 Rw Zf zv 3G 3x 6w 6k rq Yi j7 P7 El W1 KO X1 JQ vw G8 rN SZ pR j5 s7 hz zN vl Eh yy ub Vl Re ax qW mI Lh 3b uv LG dk ha Bl PD 4P YH vj XH Zv C2 2O eV vl CE iG YU oT tF LB kh Pi Tl 63 Xz tR cq gm ki sB xI pH Le Go语言并发编程 - i'm jackey - i'm jackey

Go语言并发编程

Jackey Golang 1,219 次浏览 , , 没有评论

协程

与传统的系统级线程和进程相比,协程的大优势在于其“轻量级”,可以轻松创建上百万个而不会导致系统资源衰竭,而线程和进程通常多也不能超过1万个。这也是协程也叫轻量级线程的原因。

goroutine–Go对协程的实现 :

go + 函数名:启动一个协程执行函数体

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "time"
  6. )
  7.  
  8. func test_Routine() {
  9. fmt.Println("This is one routine!!!")
  10. }
  11.  
  12. func Add(x, y int) {
  13. z := x + y
  14. fmt.Println(z)
  15. }
  16.  
  17. func main() {
  18. for i := 1; i < 10; i++ {
  19. go Add(i, i)
  20. }
  21.  
  22. time.Sleep(2)
  23. }

 

channel

Go语言在语言级别提供的goroutine间的通信方式

channel的写与读:

ch <- c 写

c:= <- ch 读

阻塞 除非有goroutine对其进行操作

  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "strconv"
  6. )
  7.  
  8. func Add(x, y int, quit chan int) {
  9. z := x + y
  10. fmt.Println(z)
  11.  
  12. quit <- 1
  13. }
  14.  
  15. func Read(ch chan int) {
  16. value := <-ch
  17.  
  18. fmt.Println("value:" + strconv.Itoa(value))
  19. }
  20.  
  21. func Write(ch chan int) {
  22. //ch <- 10
  23. }
  24.  
  25. func main() {
  26. //ch := make(chan int)
  27. //go Read(ch)
  28. //go Write(ch)
  29.  
  30. //time.Sleep(10)
  31.  
  32. //fmt.Println("end of code")
  33.  
  34. chs := make([]chan int, 10)
  35. for i := 0; i < 10; i++ {
  36. chs[i] = make(chan int)
  37. go Add(i, i, chs[i])
  38. }
  39.  
  40. for _, v := range chs {
  41. <-v
  42. }
  43. }

 

缓冲channel

c := make(chan int, n) ,n为缓冲区大小

c := make(chan int) 等价于c:=make(chan int, 0)

缓冲channel的写与读:

ch <- c 写

c:= <- ch 读

缓冲满之后阻塞 除非有goroutine对其进行操作

  1. // 缓冲channel
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. var ch chan int
  10.  
  11. func test_channel() {
  12. ch <- 1
  13. fmt.Println("ch 1")
  14. ch <- 1
  15. fmt.Println("ch 2")
  16. ch <- 1
  17. fmt.Println("come to end goroutine 1")
  18. }
  19.  
  20. func main() {
  21. ch = make(chan int, 0) // 等价于 ch = make(chan int) 都是不带缓冲的channel
  22. ch = make(chan int, 2) // 是带缓冲的channel
  23. go test_channel()
  24. time.Sleep(2 * time.Second)
  25. fmt.Println("running end!")
  26. <-ch
  27.  
  28. time.Sleep(time.Second)
  29. }

 

select

Linux很早就引入的函数,用来实现非阻塞的一种方式

Go语言直接在语言级别支持select关键字,用于处理异步IO 问题

  1. select {
  2. case <-chan1: // 如果chan1成功读到数据,则进行该case处理语句
  3.  
  4. case chan2 <- 1: // 如果成功向chan2写入数据,则进行该case处理语句
  5.  
  6. default: // 如果上面都没有成功,则进入default处理流程
  7. }

 

  1. // select.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. func main() {
  10. ch := make(chan int)
  11.  
  12. go func(ch chan int) {
  13. ch <- 1
  14. }(ch)
  15.  
  16. time.Sleep(time.Second)
  17.  
  18. select {
  19. case <-ch:
  20. fmt.Print("come to read ch!")
  21. default:
  22. fmt.Print("come to default!")
  23. }
  24. }

 

超时控制的经典实现:

  1. timeout := make(chan bool, 1)
  2. go func() {
  3. time.Sleep(1e9) // 等待1秒钟
  4. timeout <- true
  5. }()
  6.  
  7. // 然后我们把timeout这个channel利用起来
  8. select {
  9. case <-ch: // 从ch中读取到数据
  10. case <-timeout: // 一直没有从ch中读取到数据,但从timeout中读取到了数据
  11. }

 

  1. // select.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. func main() {
  10. ch := make(chan int)
  11. timeout := make(chan int, 1)
  12.  
  13. go func() {
  14. time.Sleep(time.Second)
  15. timeout <- 1
  16. }()
  17.  
  18. select {
  19. case <-ch:
  20. fmt.Print("come to read ch!")
  21. case <-timeout:
  22. fmt.Print("come to timeout!")
  23. }
  24.  
  25. fmt.Print("end of code!")
  26. }

 

还可以使用 time.After(…) 作为超时控制

  1. // select.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "time"
  7. )
  8.  
  9. func main() {
  10. ch := make(chan int)
  11.  
  12. select {
  13. case <-ch:
  14. fmt.Print("come to read ch!")
  15. case <-time.After(time.Second):
  16. fmt.Print("come to timeout!")
  17. }
  18.  
  19. fmt.Print("end of code!")
  20. }

 

协程与线程质的不同

协程的特点:

  • 该任务的业务代码主动要求切换,即主动让出执行权
  • 发生了IO,导致执行阻塞
  1. // goroutine_2.go
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "runtime"
  7. "strconv"
  8. "time"
  9. )
  10.  
  11. func main() {
  12. //协程1
  13. go func() {
  14. for i := 1; i < 100; i++ {
  15. if i == 10 {
  16. //主动出让cpu 使用的话 需要 导入 runtime包
  17. runtime.Gosched()
  18. }
  19. fmt.Println("routine 1:" + strconv.Itoa(i))
  20. }
  21. }()
  22.  
  23. //协程2
  24. go func() {
  25. for i := 100; i < 200; i++ {
  26. fmt.Println("routine 2:" + strconv.Itoa(i))
  27. }
  28. }()
  29.  
  30. time.Sleep(time.Second)
  31. }
  1. // goroutine
  2. package main
  3.  
  4. import (
  5. "fmt"
  6. "strconv"
  7. "time"
  8. )
  9.  
  10. var ch chan int
  11.  
  12. func main() {
  13. ch = make(chan int)
  14. //协程1
  15. go func() {
  16. for i := 1; i < 100; i++ {
  17. if i == 10 {
  18. //遇到了阻塞
  19. <-ch
  20. }
  21. fmt.Println("routine 1:" + strconv.Itoa(i))
  22. }
  23. }()
  24.  
  25. //协程2
  26. go func() {
  27. for i := 100; i < 200; i++ {
  28. fmt.Println("routine 2:" + strconv.Itoa(i))
  29. }
  30.  
  31. ch <- 1
  32. }()
  33.  
  34. time.Sleep(time.Second)
  35. }

java的多线程:

  1. public class thread {
  2. public static void main(String[] args){
  3. new Thread(new Test_thread()).start();
  4. new Thread(new Test_thread2()).start();
  5. }
  6. }
  7.  
  8. class Test_thread implements Runnable{
  9. public void run() {
  10. for (int i = 0; i < 100; i++) {
  11. System.out.println("thread 1:" + i);
  12. }
  13. }
  14. }
  15.  
  16. class Test_thread2 implements Runnable{
  17. public void run() {
  18. for (int i = 100; i < 200; i++) {
  19. System.out.println("thread 2:" + i);
  20. }
  21. }
  22. }

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注

Go