Có những ý tưởng sai lầm nào khiến mọi người bỏ qua việc sử dụng các chủ đề? [đóng cửa]


12

Thực hiện phân luồng trong một chương trình là khó, vâng, tuy nhiên tại sao một số người sẽ không thực hiện chúng ngay cả khi có nhu cầu rõ ràng về nó.

Một ví dụ: Chương trình phải tải một tập dữ liệu từ cơ sở dữ liệu, việc cần làm là tạo kết nối và lấy dữ liệu từ cơ sở dữ liệu trong một luồng công nhân và sau đó tải nó vào GUI, để lại chủ đề GUI đáp ứng cho người dùng .

Nhưng không, tôi đã nói chuyện với những người dường như nghĩ rằng chủ đề là xấu và xấu và không nên và họ nên tránh chúng bằng mọi giá. Tôi thậm chí đã nghe nói rằng một số người hướng dẫn lớp khuyên không nên sử dụng các chủ đề và do đó không muốn sử dụng chúng. GÌ???

Với phần cứng đi vào đa lõi, tôi nghĩ rằng chúng ta cần hiểu rõ hơn về các luồng và không ngại sử dụng chúng. Tôi thấy nó là một chủ đề hấp dẫn cá nhân.

Vì vậy, những điều bạn đã nghe về luồng là sai?


Misfits và underachievers không thể xử lý chủ đề. Câu hỏi thực sự là: bạn sẽ làm gì về điều đó?
Công việc

3
Đó không phải là những ý tưởng sai lầm, nhưng chủ đề nên luôn luôn nên tránh. Làm kiến ​​trúc của bạn một cách chính xác để hỗ trợ luồng đã được xử lý chính xác và mọi lập trình viên không cần phải tự làm điều đó. Một khi các lập trình viên học cách thêm một chủ đề, mọi tình huống bạn sẽ gặp vấn đề lớn.
tp1

Hãy để tôi quay lại câu hỏi xung quanh bạn. Bạn có tự hỏi liệu có cách tiếp cận khác để khai thác khả năng xử lý song song không? Hoặc, bạn vừa nhảy thẳng vào luồng vì một số whitepaper đã nói, hoặc có thể vì đó là những gì lập trình viên tốt hơn dường như nghĩ là tuyệt vời? Cá nhân, tôi thích ý tưởng về các quy trình nhẹ truyền tin nhắn cho nhau tốt hơn nhiều so với các chủ đề. Tôi lười biếng / ngu ngốc / vội vàng? Vâng - và tất cả chúng ta cũng vậy, đến nhiều phạm vi khác nhau.
1172763

Câu trả lời:


19

Luồng rất khó

Chắc chắn rồi. Nó có thể. Tuy nhiên, mọi người có ý tưởng này trong đầu rằng nó rất khó, đến nỗi họ không buồn cố gắng tìm ra nó.

Nó không giống như nó là không thể.


2
Tôi ủng hộ câu trả lời này. Mọi người nghĩ rằng nó khó. Tuy nhiên, đó không phải là khi bạn dành đủ thời gian để cố gắng hiểu.

11
@Pierre, tôi mong rằng rất nhiều định nghĩa khó của mọi người "bạn phải dành đủ thời gian để cố gắng hiểu".
Stewol

1
Việc xâu chuỗi trở nên dễ dàng hơn rất nhiều với TPL và await/ asynctừ khóa :)
Rachel

@Pierre 303: Khi bạn dành đủ thời gian để hiểu nó vẫn khó , và trên thực tế, những người hiểu nó tốt nhất có khả năng tránh nó nhiều nhất có thể.
Michael Borgwardt

9

Đó không phải là phần luồng khó, nhưng cần phải đồng bộ hóa và mọi thứ khác đi kèm với việc sử dụng các luồng. Trong ví dụ GUI của bạn, làm thế nào để bạn biết chủ đề chính mà bộ dữ liệu đã sẵn sàng để được truy cập? Bạn có vượt qua một loạt các cuộc gọi lại? Bạn có phân tán toàn bộ các biến kiểm tra trong toàn bộ mã của mình không? Trong một số mô hình GUI, ví dụ Silverlight, có một thứ gọi là ái lực luồng, nghĩa là bạn không được truy cập các phần tử GUI nằm trên luồng chính từ các luồng khác, do đó bạn phải tránh đường để cho luồng chính biết thông tin nhất định là sẵn sàng để được xử lý hơn nữa.

Tôi thực sự không nghe thấy bất kỳ điều sai về chủ đề. Tôi vừa đọc một loạt các nghiên cứu trường hợp tình huống về việc đồng bộ hóa là một con chó cái khi bất kỳ thuật toán nào bạn đang sử dụng không phải là song song.


Lưu ý đến bản thân: viết các thuật toán song song ... cảm ơn.
Dropogans

Hàng đợi tin nhắn (giống như trong MFC). Tuy nhiên, việc các lập trình viên không phá hoại hàng đợi tin nhắn (bằng cách chia sẻ trực tiếp dữ liệu trong bộ nhớ), ngay cả khi đó là một hành vi phạm tội có thể xảy ra, dường như đã thất bại.
rwong

3

Threading giải quyết tất cả các vấn đề của bạn

Nếu bạn gặp vấn đề về hiệu suất, bạn không nên chuyển sang luồng.

Chủ đề rất nhẹ

Chủ đề là nhẹ trong hàng chục và hai mươi. Sinh ra hàng ngàn chủ đề là không.

Việc tạo luồng rất dễ dàng [Java]

Thật dễ dàng để tạo chủ đề, điều đó không có nghĩa là bạn sẽ được hưởng lợi từ nó.


Chỉ để ghi lại, Mac OS sẽ không cho phép bạn (trên bản cài đặt mặc định) tạo hơn 512 luồng.
zneak

1
Điều đó thực sự phụ thuộc vào ngôn ngữ của bạn. Sinh ra 1 triệu luồng trong Erlang hầu như không đáng chú ý, ngay cả trên một máy tính xách tay cũ, chưa nói đến một máy chủ hiện đại. Và trên thực tế, những thứ này thậm chí không chỉ là các luồng, chúng là các quá trình toàn diện , nghĩa là nặng hơn nhiều so với các luồng. Ngoài bộ đếm chương trình và ngăn xếp cuộc gọi của riêng họ (gần như là những thứ duy nhất mà một luồng có), họ cũng có đống riêng của họ và thậm chí cả trình thu gom rác của riêng họ.
Jörg W Mittag

4
@ Jorg W Mittag: Tôi bối rối trước bình luận của bạn. Làm thế nào để erlang thay đổi cách hệ điều hành tạo ra một luồng hoặc quá trình?
Steven Evers

1
@SnOrfus: Erlang không sử dụng các luồng hệ điều hành. Có ba triển khai Erlang chính ngay bây giờ: BEAM, HiPE và Erjang. BEAM và HiPE là các triển khai riêng (thậm chí có thể chạy mà không cần bất kỳ HĐH nào) và thực hiện các quy trình riêng của chúng. Erjang chạy trên JVM và thực hiện các quy trình bằng thư viện Kilim cực kỳ xuất sắc.
Jörg W Mittag

@ Jörg W Mittag: Xem xét các lập trình viên câu hỏi của tôi.stackexchange.com/questions/ 28453/ , tôi thấy điều này rất thú vị. Cảm ơn bạn.
Steven Evers

1

Cuối cùng, bạn sẽ mất bất kỳ lợi ích nào từ việc phân luồng vì sửa các lỗi điên phát sinh từ việc sử dụng một số thư viện / chức năng không an toàn cho luồng (những gì bạn không biết) sẽ yêu cầu đồng bộ hóa quá mức.

Bạn có xác suất gặp lỗi cao hơn nhiều mà bạn sẽ không thể sửa nếu bạn sử dụng các luồng sau đó khi bạn không.


Lỗi không thể sửa được? Tôi chưa từng thấy một trong số đó trước đây ..
adamk

Bạn thực sự chưa bao giờ thấy một lỗi mà bạn không thể sửa chữa? Trong thời gian và cho các khoản thanh toán đã có sẵn?
Kamil Szot

Nếu bạn chưa bao giờ gặp phải một lỗi không thể sửa được thì bạn đã ở trong ngành đủ lâu. Trong hơn 12 năm làm việc, mọi dự án tôi từng xem đều có ít nhất một lỗi mà không ai sửa được và không ai biết cách khắc phục hoặc thậm chí tái tạo. Điều này bao gồm mã tôi đã được sử dụng để làm việc và mã tôi có quyền truy cập để đọc (mã nguồn mở). Các phần mềm duy nhất không có lỗi là những phần mềm dài chưa đến 2 hoặc 3 trang. Nhưng làm cho tất cả mã của bạn dài 1 hoặc 2 trang không giải quyết được hoàn toàn bất cứ điều gì vì sau đó bạn có lỗi tích hợp.
slebetman

1

Để tóm tắt điểm khôn ngoan tại sao các luồng khó sử dụng: -
Đúng 1) Cần đồng bộ hóa và quyết định thiết kế cẩn thận về việc khóa và khi nào khóa
2) Không kiểm soát luồng thời gian chạy
3) Khó gỡ lỗi
4) (Rất ít lần) khả năng tương thích nền tảng: - Các thư viện tồn tại để giải quyết vấn đề này

Những điều sai: -
1) Các khái niệm khó hiểu về các chức năng của chủ đề an toàn và tái nhập
2) Chủ đề có vẻ tốt trên giấy nhưng rất khó thực hiện


Những điều này được cho là đúng hay không đúng sự thật? OP đã hỏi về những điều không đúng sự thật và khiến mọi người sợ hãi khi thực hiện lập trình đa luồng.
Steven Evers

thực sự bạn không cần khóa hoặc đồng bộ hóa. Ngoài ra còn có các mô hình chuyển tin nhắn (ví dụ erlang, scala) và mô hình STM (ví dụ: clojure). Và trên hết, có các cấu trúc dữ liệu an toàn theo luồng không cần khóa (ConcảnHashMap trong java) và các nguyên hàm nguyên tử không yêu cầu khóa.
Kevin

1

Nếu bạn không muốn viết bài kiểm tra cho mã của mình, thì đừng sử dụng các chủ đề.

Các chủ đề không dành cho lập trình viên 'sao chép và dán' điển hình, những người không hiểu các nguyên tắc cơ bản cơ bản của kiến ​​trúc hệ điều hành và máy tính. Do 90% lập trình viên chỉ quen thuộc với Java, nên những người này thực sự không phải là những người nên sử dụng các luồng. Java làm cho các luồng "dễ dàng" nhưng tôi đã thấy rất nhiều lập trình viên chỉ nghĩ rằng nếu họ sử dụng các cấu trúc được đồng bộ hóa thì mã của họ sẽ hoạt động trong các luồng .... uhm không.

Điều đó đang được nói, tất cả mọi người cần phải bắt đầu ở đâu đó, chỉ cần không thực hiện dự án luồng đầu tiên của bạn nâng cấp máy chủ phụ trợ sản xuất của bạn.


Bạn có thể giới thiệu một số tài nguyên về cách làm chủ đề chính xác?
Jonathan

Tôi chắc chắn rằng điều này đã được giải quyết. Hãy thử bắt đầu tại đây stackoverflow.com/questions/660621/threading-best-practices
cmcginty

Vấn đề với điều này là ngay cả khi bạn có phạm vi kiểm tra 100%, bạn sẽ không có cách nào để biết liệu các bài kiểm tra của bạn có bao gồm tất cả các vấn đề có thể xảy ra với cách hướng dẫn xen kẽ với các tài nguyên được chia sẻ hay không. Mặt khác, với một kiến ​​trúc không có gì được chia sẻ, nó trở nên dễ dàng hơn nhiều.
Zachary K

1

Một ví dụ: Chương trình phải tải một tập dữ liệu từ cơ sở dữ liệu, việc cần làm là tạo kết nối và lấy dữ liệu từ cơ sở dữ liệu trong một luồng công nhân và sau đó tải nó vào GUI, để lại chủ đề GUI đáp ứng cho người dùng .

Tôi không thấy rằng tình huống này thể hiện sự cần thiết phải sử dụng luồng cho ít nhất 4 lý do:

  1. Việc truy xuất dữ liệu phải rất nhanh.

  2. Trong nhiều ứng dụng Line of Business, người dùng không liên quan gì đến ứng dụng trong 1 hoặc 2 giây mà anh ấy / cô ấy đang chờ kết quả. Ngoài ra, người dùng sẽ phải đợi cho đến khi dữ liệu quay trở lại bất kỳ cách nào để hoàn thành nhiệm vụ mong muốn. Mặt khác, truy vấn có thể được mã hóa một cách thông minh để nó chỉ lấy một trang chứa đầy thông tin tại một thời điểm và các kỹ thuật tối ưu hóa khác có thể giúp thời gian phản hồi.

  3. Trong các giao diện dựa trên web, các liên kết có thể được kích hoạt liên quan đến mô hình luồng.

  4. Việc thêm luồng phức tạp khi bạn thừa nhận, một số nhà phát triển xuống dòng có thể không thể thêm các tính năng hoặc gỡ lỗi mã phức tạp.

Ý kiến ​​của tôi là: Sử dụng luồng khi bạn phải bởi vì khả năng bảo trì và độ tin cậy của phần mềm có giá trị hơn đối với một tổ chức hơn là sự thanh lịch của mã.


1
Điểm đầu tiên của bạn làm tôi nhớ đến những ngụy biện của điện toán phân tán ( en.wikipedia.org/wiki/Fallsites_of_Distribution_Computing ). Rất nhiều người dùng có thể bắt đầu nhấp chuột dữ dội khi họ phải chờ hơn 1 hoặc 2 giây từ điểm 2 của bạn để có giao diện không phản hồi, khiến mọi thứ trở nên tồi tệ hơn.
Bảo mật

@Secure, liên kết rất thú vị, cảm ơn vì đã chia sẻ nó. Tôi không chắc chắn chúng ta có thể luôn tập trung vào người dùng mọi lúc trên giao diện hay thậm chí toàn bộ công việc trong thời đại ngày nay. Tôi đồng ý với bạn rằng trong các trang web E-Business, bạn không muốn người dùng biến mất.
NoChance

Tôi không nói về trọng tâm. Khi người dùng nhấp vào nút và giao diện chỉ bị đóng băng vì cơ sở dữ liệu được truy vấn, không có phản hồi trực quan nào đó đã được thực hiện, một số người dùng cố gắng nhấp lại vào nút. Và một lần nữa. Sau đó cố gắng nhấp vào các nút hoặc tùy chọn khác. Tôi đã thấy quản trị viên làm điều này những người nên biết rõ hơn.
Bảo mật

Thậm chí tệ hơn khi màn hình kết quả được vẽ lần đầu tiên, nhưng hiển thị trống. Không biết về hầu hết các phiên bản hiện tại, nhưng kết quả tìm kiếm trong các Outlook cũ hơn là một ví dụ tồi. Khi bắt đầu tìm kiếm, nó hiển thị "Tập kết quả trống" hoặc đại loại như thế này, trong vài giây với cơ sở tìm kiếm lớn, hiển thị kết quả đầu tiên khi được tìm thấy. Nếu bạn quá nôn nóng hoặc vội vàng, bạn đã chuyển sang thư mục tiếp theo, tin rằng không có gì ở đó.
Bảo mật

1
@Secure, tôi thấy quan điểm của bạn. Những gì bạn đang mô tả ở đây cho thấy một ví dụ tốt về giao diện người dùng không nhất quán. Những gì bạn đã mô tả cũng xảy ra khi bạn tìm kiếm các tập tin. Nhưng câu trả lời cho vấn đề này là gì ngoài việc nói với người dùng rằng việc tìm kiếm đã bắt đầu?
NoChance
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.