sách gpt4 ăn đã đi

Hãy nói về mô hình lập trình đường dẫn của Go

In lại Tác giả: qq735679552 Thời gian cập nhật: 27-09-2022 22:32:09 29 4
mua khóa gpt4 giày nike

CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.

Bài viết trên blog CFSDN này nói về mô hình lập trình Go pipe được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm đến bài viết này thì nhớ like nhé.

Hãy nói về mô hình lập trình đường dẫn của Go

Mô hình làm việc dây chuyền lắp ráp rất phổ biến trong lĩnh vực công nghiệp, nó chia quy trình làm việc thành nhiều mắt xích, mỗi mắt xích bố trí số lượng nhân sự phù hợp tùy theo cường độ công việc. Thiết kế dây chuyền lắp ráp tốt nên cố gắng cân bằng tốc độ tuần hoàn của từng mắt xích và tối đa hóa hiệu quả sản xuất.

Go là một ngôn ngữ thực tế và mô hình làm việc của đường ống được tích hợp rất hài hòa với Go, nhưng chúng ta thường sử dụng một danh từ khác để chỉ đường ống: đường ống.

đường ống

Quy trình bao gồm nhiều liên kết. Cụ thể trong Go, các liên kết giao tiếp qua các kênh và các tác vụ trong cùng một liên kết có thể được xử lý bởi nhiều goroutine cùng một lúc.

Hãy nói về mô hình lập trình đường dẫn của Go

đường ống 。

Cốt lõi của đường ống là luồng dữ liệu được đảm bảo thông qua các kênh và việc xử lý dữ liệu trong mỗi liên kết được hoàn thành bởi goroutine.

Ngoại trừ liên kết bắt đầu và liên kết cuối, mỗi liên kết có số lượng kênh đầu vào và kênh đầu ra bất kỳ. Liên kết bắt đầu được gọi là người gửi hoặc nhà sản xuất và liên kết kết thúc được gọi là người nhận hoặc người tiêu dùng.

Chúng ta hãy xem một ví dụ về đường ống đơn giản, được chia thành ba liên kết.

Liên kết đầu tiên là hàm tạo: nó hoạt động như một nhà sản xuất, ghi dữ liệu vào kênh và trả về kênh. Khi tất cả dữ liệu được ghi, hãy đóng kênh.

  1. funcgenerate(số...số nguyên)<-cậu bésố nguyên{
  2. ngoài:=làm(chansố nguyên)
  3. gofunc(){
  4. _,n:=phạm vi số{
  5. ngoài<-n
  6. }
  7. đóng(ngoài)
  8. }()
  9. trở lạingoài
  10. }

Liên kết thứ hai, hàm bình phương: Có vai trò xử lý dữ liệu từ kênh ở liên kết đầu, tính bình phương, ghi kết quả vào kênh mới và trả về kênh mới. Khi tất cả dữ liệu được tính toán, hãy đóng kênh mới.

  1. hàm vuông(TRONG<-chansố nguyên)<-cậu bésố nguyên{
  2. ngoài:=làm(chansố nguyên)
  3. gofunc(){
  4. n:=phạm viTRONG{
  5. ngoài<-n*n
  6. }
  7. đóng(ngoài)
  8. }()
  9. trở lạingoài
  10. }

Chức năng chính chịu trách nhiệm sắp xếp toàn bộ đường ống và đóng vai trò là người tiêu dùng: đọc dữ liệu kênh của liên kết thứ hai và in ra.

  1. hàm
  2. //Bộlên đường ống.
  3. c:=tạo(2,3)
  4. ngoài:=vuông(c)
  5. //Tiêu thụđầu ra.
  6. n:=phạm vingoài{
  7. fmt.Println(n)
  8. }
  9. }

Quạt ra, quạt vào

Trong ví dụ trên, dữ liệu được truyền giữa các liên kết thông qua các kênh không có bộ đệm và dữ liệu trong các nút được xử lý và sử dụng bởi một goroutine duy nhất.

Chế độ làm việc này không hiệu quả và sẽ khiến hiệu quả của toàn bộ đường ống phụ thuộc vào liên kết chậm nhất. Bởi vì số lượng nhiệm vụ trong mỗi liên kết là khác nhau, điều này có nghĩa là tài nguyên máy mà chúng ta cần cũng khác nhau. Các liên kết có khối lượng tác vụ nhỏ sẽ chiếm một lượng nhỏ tài nguyên máy càng nhiều càng tốt. Các liên kết có khối lượng tác vụ nặng sẽ yêu cầu nhiều luồng hơn để xử lý song song.

Lấy việc lắp ráp ô tô làm ví dụ, chúng ta có thể phân công công việc lắp ráp lốp cho 4 người. Khi lắp ráp lốp, chúng ta có thể bàn giao các mắt xích còn lại.

Nhiều goroutine có thể đọc dữ liệu từ cùng một kênh cho đến khi kênh đó bị đóng, điều này được gọi là phân xuất quạt.

Tên này sống động hơn. Nó phân tán dữ liệu nên được gọi là phân tán. Fan-out là một mẫu để phân phối nhiệm vụ.

Hãy nói về mô hình lập trình đường dẫn của Go

quạt ra 。

Một goroutine duy nhất có thể đọc dữ liệu từ nhiều kênh đầu vào cho đến khi tất cả đầu vào được đóng lại. Phương pháp cụ thể là ghép các kênh đầu vào vào cùng một kênh. Khi tất cả các kênh đầu vào được đóng, kênh này cũng được gọi là fan-in.

Nó tổng hợp dữ liệu nên được gọi là fan-in. Fan-in là một mẫu để tích hợp các kết quả nhiệm vụ.

Hãy nói về mô hình lập trình đường dẫn của Go

người hâm mộ vào.

Trong ví dụ về lắp ráp ô tô, việc phân chia nhiệm vụ lốp cho mọi người là Fan-out, và việc gộp kết quả lắp ráp lốp là Fan-in.

ghép kênh

Mô hình mã hóa của fan-out tương đối đơn giản và sẽ không được nghiên cứu trong bài viết này. Chúng tôi cung cấp một ví dụ về lập trình fan-in.

Tạo hàm tạo để kiểm soát tần suất tạo tin nhắn thông qua tham số khoảng. Bộ tạo trả về kênh thông báo mc và kênh dừng sc. Kênh dừng được sử dụng để dừng tác vụ tạo.

  1. funcgenerate(chuỗi tin nhắn,khoảng thời gianthời gian.Thời lượng)(chuỗi chan, chanstruct{}){
  2. mc:=make(chuỗi ký tự)
  3. sc:=make(chanstruct{})
  4. gofunc(){
  5. trì hoãn chức năng(){
  6. đóng(sc)
  7. }()
  8. {
  9. lựa chọn{
  10. trường hợp<-sc:
  11. trở lại
  12. mặc định:
  13. thời gian.Ngủ(khoảng thời gian)
  14. mc<-tin nhắn
  15. }
  16. }
  17. }()
  18. trở lạimc,sc
  19. }

Hàm stopGenerate thông báo tạo để thoát bằng cách chuyển một cấu trúc trống vào sc và gọi close(mc) để đóng kênh thông báo.

  1. funcstopGenerating(chuỗi mcchan, scchanstruct{}){
  2. sc<-cấu trúc{}{}
  3. đóng(m.c)
  4. }

Chức năng ghép kênh multiplex tạo và trả về một wg tích hợp các kênh thông báo và điều khiển sự tương tranh.

  1. funcmultiplex(mcs...chuỗi chan)(chuỗi chan,*đồng bộ.WaitGroup){
  2. mmc:=make(chuỗi ký tự)
  3. wg:=&sync.WaitGroup{}
  4. _,mc:=phạm vimcs{
  5. tập.Thêm vào(1)
  6. gofunc(mcchanstring,wg*sync.WaitGroup){
  7. deferwg.Xong()
  8. m:=rangemc{
  9. mmc<-m
  10. }
  11. }(mc,wg)
  12. }
  13. trở lạimmc,wg
  14. }

Trong chức năng chính, tạo hai kênh tin nhắn và sử dụng lại chúng để tạo mmc, in từng tin nhắn từ mmc. Ngoài ra, chúng tôi cũng triển khai cơ chế tắt tinh tế để nhận tín hiệu ngắt hệ thống (thực thi CTRL+C trên thiết bị đầu cuối để gửi tín hiệu ngắt).

  1. hàm
  2. //tạo nênhai mẫu tin nhắndừng kênh
  3. mc1,sc1:=tạo("tin nhắn từ máy phát điện1",200*thời gian.Mili giây)
  4. mc2,sc2:=tạo("tin nhắn từ máy phát điện2",300*thời gian.Mili giây)
  5. //kênh tin nhắn đa kênh
  6. mmc,wg1:=multiplex(mc1,mc2)
  7. //tạo nênkênh lỗitắt máy duyên dáng
  8. errs:=make(chanerror)
  9. //Chờ đợingắthoặcchấm dứt tín hiệu
  10. gofunc(){
  11. sc:=make(chanos.Tín hiệu,1)
  12. tín hiệu.Thông báo(sc,syscall.SIGINT,syscall.SIGTERM)
  13. lỗi<-fmt.Errorf("%ssignalreceived",<-sc)
  14. }()
  15. //Chờ đợitin nhắn đa kênh
  16. wg2:=&sync.WaitGroup{}
  17. wg2.Thêm vào(1)
  18. gofunc(){
  19. deferwg2.Hoàn thành()
  20. m:=rangemmc{
  21. fmt.Println(m)
  22. }
  23. }()
  24. //Chờ đợilỗi
  25. iferr:=<-errs;err!=nil{
  26. fmt.Println(lỗi.Lỗi())
  27. }
  28. //máy phát điện dừng
  29. dừng Tạo(mc1,sc1)
  30. dừngTạo(mc2,sc2)
  31. wg1.Chờ()
  32. //đóngkênh tin nhắn đa kênh
  33. đóng(mmmc)
  34. wg2.Chờ()
  35. }

Tóm tắt

Bài viết này giới thiệu ngắn gọn về mô hình lập trình đường ống, rất giống với mô hình nhà sản xuất-người tiêu dùng mà chúng ta đã quen thuộc.

Cụ thể trong thực hành lập trình Go, đường ống chia luồng dữ liệu thành nhiều liên kết, kênh được sử dụng cho luồng dữ liệu và goroutine được sử dụng để xử lý dữ liệu. Fan-out được sử dụng để phân phối các tác vụ và fan-in được sử dụng để tích hợp dữ liệu. Chế độ FAN có thể giúp quy trình hoạt động đồng thời tốt hơn.

Tất nhiên, vẫn còn một số chi tiết cần được chú ý, chẳng hạn như cơ chế thông báo dừng. Bạn có thể tham khảo chức năng stopGenerated trong ví dụ về chương ghép kênh trong bài viết này về cách kiểm soát đồng thời thông qua đồng bộ hóa; .WaitGroup, những điều này yêu cầu người đọc phải nắm vững cách viết mã thực tế.

Thẩm quyền giải quyết.

Các mẫu đồng thời của Go: Đường ống và hủy bỏ:https://go.dev/blog/pipelines 。

Ghép kênh trong Go:https://medium.com/@ermanimer/multiplexing-channels-in-go-a7dccdcc4134 。

Liên kết gốc: https://mp.weixin.qq.com/s/IuGaKbQvW7z1KsoMhB8mgg.

Cuối cùng, bài viết về mô hình lập trình Go pipe kết thúc tại đây. Nếu bạn muốn biết thêm về mô hình lập trình Go pipe, vui lòng tìm kiếm các bài viết về CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ tôi trong tương lai! .

29 4 0
qq735679552
Hồ sơ

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá taxi Didi miễn phí
Phiếu giảm giá taxi Didi
Chứng chỉ ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com
Xem sitemap của VNExpress