Làm thế nào tôi có thể biết nếu tôi đang lạm dụng đa luồng?


15

Hiện tại tôi cảm thấy như tôi đang sử dụng quá nhiều luồng.

Tôi có 3 loại dữ liệu, A, B và C.

Mỗi Acó thể được chuyển đổi thành nhiều Bs và mỗi Bcó thể được chuyển đổi thành nhiều Cs.

Tôi chỉ quan tâm đến việc điều trị Cs.

Tôi có thể viết điều này khá dễ dàng với một vài chức năng chuyển đổi. Nhưng tôi bắt bản thân mình thực hiện nó với chủ đề, ba hàng đợi ( queue_a, queue_bqueue_c). Có hai luồng thực hiện các chuyển đổi khác nhau và một công nhân:

  • ConverterAđọc từ queue_avà viết choqueue_b
  • ConverterBđọc từ queue_bvà viết choqueue_c
  • Worker xử lý từng yếu tố từ queue_c

Các chuyển đổi khá trần tục và tôi không biết liệu mô hình này có quá phức tạp không. Nhưng nó có vẻ cực kỳ mạnh mẽ với tôi. Mỗi "trình chuyển đổi" có thể bắt đầu hoạt động ngay cả trước khi dữ liệu đến hàng đợi và bất cứ lúc nào trong mã tôi chỉ có thể "gửi" As hoặc Bs mới và nó sẽ kích hoạt đường ống chuyển đổi sẽ lần lượt kích hoạt công việc của nhân viên chủ đề.

Ngay cả mã kết quả trông đơn giản hơn. Nhưng tôi vẫn không chắc chắn nếu tôi lạm dụng các chủ đề cho một cái gì đó đơn giản.


5
Tôi nghĩ rằng câu hỏi này cần phải được rút ngắn một chút để cắt để đuổi theo. Tiêu đề cũng gây hiểu lầm - có vẻ như bạn sắp tung ra một câu thần chú (mặc dù bạn không). Có lẽ bạn nên hỏi một cái gì đó gần hơn với "Làm thế nào tôi có thể biết nếu tôi đang lạm dụng đa luồng?"
KChaloux

@KChaloux Tôi đồng ý. Tôi đã chỉnh sửa nó, và hy vọng nó nắm bắt được suy nghĩ của tôi tốt hơn một chút.
shoutuma

4
@exhuma Tuyệt vời. -1 của bạn trở thành +1
KChaloux

3
@KChaloux ... sự khác biệt của chuyến viếng thăm có thể tạo ra quá trình suy nghĩ của bạn ... :)
shoutuma

Cuốn sách PDF trực tuyến này, Cẩm nang tối ưu hóa trưởng thành (vừa xuất bản vài ngày trước) nói về các hiệu ứng hệ thống trong đó tác động của một mô-đun đến hiệu suất hệ thống tổng thể đôi khi có thể vượt quá một phần thời gian thực hiện của mô-đun.
rwong

Câu trả lời:


16

Hầu như luôn luôn đơn giản hơn để suy nghĩ tuần tự, và sau đó sửa đổi logic đó để hoạt động tốt hơn bằng cách sử dụng các luồng. Và, như cách diễn đạt, "Nếu nó không bị hỏng, đừng sửa nó." Hầu hết các lập trình viên không sử dụng các chủ đề đơn giản vì không cần sử dụng chúng.

Nếu bạn cảm thấy thoải mái hơn khi sử dụng chúng, sẽ tiếp thêm sức mạnh cho bạn. Tuy nhiên, hãy biết rằng nếu các luồng không cung cấp tăng tốc bằng cách loại bỏ các tắc nghẽn, chúng gần như chắc chắn làm chậm chương trình của bạn.

Cũng xem xét rằng các hệ thống chỉ dành một CPU cho một quy trình sẽ mô phỏng nhiều luồng bằng một luồng duy nhất để tiết kiệm tài nguyên (điều này không xảy ra thường xuyên với các máy tính hiện đại, mặc dù các ứng dụng điện thoại thông minh vẫn bị lạm dụng rất nhiều). Trong trường hợp này, ngay cả khi bạn loại bỏ các tắc nghẽn thông qua việc sử dụng các luồng, nó thực sự sẽ chậm hơn so với khi bạn không sử dụng các luồng.

Và, có lẽ là lý do tinh tế nhất để sử dụng thận trọng để sử dụng các chủ đề, nhưng chắc chắn không phải là ít quan trọng nhất, các chủ đề có xu hướng làm những gì bạn không mong đợi. Có, nếu bạn đang thực hiện các biện pháp phòng ngừa, bạn sẽ ổn thôi. Có, nếu chủ đề của bạn không ghi vào các biến được chia sẻ giữa các chủ đề, bạn sẽ ổn thôi. Điều đó nói rằng, các lỗi liên quan đến chủ đề rất khó tìm. Vì tôi cho rằng một lập trình viên không thể loại bỏ hoàn toàn khả năng tạo ra các lỗi trong mã và do đó, một lập trình viên nên có biện pháp bảo vệ chống lại các lỗi có thể xảy ra thay vì tập trung vào việc loại bỏ hoàn toàn chúng, bạn chắc chắn nên áp dụng ý tưởng này vào khó khăn để tìm lỗi chủ đề là tốt. Nói cách khác, hãy biết rằng bất chấp những nỗ lực hết sức của bạn,

Vì vậy, bạn nên sử dụng chủ đề nào? Vâng, một kiến ​​thức lành mạnh về các chủ đề chắc chắn không phải là một điều xấu, đặc biệt là nếu bạn trở nên giỏi về nó. Tuy nhiên, sự chuyển động muộn đã hướng đến các ngôn ngữ đơn luồng như node.js. Một trong những lợi thế chính của việc có một luồng duy nhất là dễ dàng mở rộng quy mô và một số tối ưu hóa nhất định có thể được thực hiện nếu bạn biết rằng các hướng dẫn dự kiến ​​sẽ được chạy tuần tự (ngay cả khi tối ưu hóa có thể có nghĩa là các lệnh có thể chạy song song được chạy không đồng bộ).

Điều đó nói rằng, tôi nói làm những gì thoải mái nhất cho bạn. Theo kinh nghiệm của tôi, viết một chương trình mà bạn hiểu có mức độ ưu tiên cao hơn là làm cho nó hoạt động nhanh hơn. Chỉ cần chắc chắn sử dụng các luồng khi bạn nghĩ rằng nó giúp bạn viết chương trình, và không phải vì bạn muốn nó hoạt động nhanh hơn, vì bạn không nên lo lắng quá nhiều về hiệu suất khi bạn đang viết chương trình (tối ưu hóa là quan trọng, nhưng nó cũng có thể chờ).


Bạn đang làm cho điểm thú vị. Trong trường hợp của tôi, đường ống chuyển đổi không phải là về hiệu suất. Đó là về sự đơn giản / dễ đọc mã. Chủ đề công nhân về hiệu suất. Mỗi tác vụ cuối cùng chạy trên một máy từ xa và việc gửi nhiều công việc làm cho nó chạy nhanh hơn đáng kể.
shoutuma

2
@exhuma Bên cạnh việc thực thi song song qua nhiều luồng, bạn cũng có thể sử dụng các kỹ thuật không đồng bộ như Tương lai / Lời hứa hoặc kiểu định hướng gọi lại. Lưu ý rằng bạn có thể mô hình hóa các đường ống bằng cách xâu chuỗi lặp / luồng; không cần thực sự sử dụng các luồng - ngoại trừ nếu bạn muốn sử dụng nhiều CPU (Trong mã mạng, điều này gần như không bao giờ xảy ra)
amon

@exhuma Có, chủ đề giúp với hiệu suất nói chung. Quan điểm của tôi là nếu bạn không làm điều đó vì nó quá chậm, thì bạn nên làm điều đó vì nó giúp bạn viết chương trình của mình. Tối ưu hóa phải luôn luôn đến sau. Thậm chí có thể loại bỏ các luồng khỏi chương trình của bạn là tối ưu hóa nó (mặc dù đó không phải là trường hợp của hầu hết các lập trình viên).
Neil

OT: Tôi yêu avatar của bạn. Làm tôi cười.
Marjan Venema

@exhuma, tôi đồng ý với câu trả lời này nhưng tôi sẽ nói thêm rằng nếu bạn định sử dụng các luồng để đơn giản mã, thì tốt, nhưng hãy cẩn thận rằng bạn hiểu các vấn đề về an toàn luồng và tiềm năng với nhiều luồng. Những gì có vẻ như là một đoạn mã đa luồng đơn giản có thể dễ dàng có các điều kiện chủng tộc ẩn có thể dẫn đến một loại lỗi rất khó theo dõi.
Ben Lee
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.