Điều gì sẽ là cách tốt nhất để xử lý lỗi trong các chương trình song song?


11

Với các thuật toán song song gõ cửa, đây có thể là thời điểm tốt để suy nghĩ về việc xử lý lỗi.

Vì vậy, lúc đầu đã có mã lỗi. Những người bị hút. Nó là miễn phí để bỏ qua chúng, vì vậy bạn có thể thất bại muộn và tạo mã khó gỡ lỗi.

Sau đó đến ngoại lệ. Những người đó đã không thể bỏ qua một khi chúng xảy ra, và hầu hết mọi người (trừ Joel) thích họ hơn.

Và bây giờ chúng tôi có các thư viện giúp mã song song. Vấn đề là, bạn không thể xử lý các ngoại lệ trong mã song song dễ dàng như bạn có thể với mã không song song. Nếu bạn khởi chạy không đồng bộ một tác vụ và nó ném ra một ngoại lệ, sẽ không có dấu vết ngăn xếp nào vượt qua nó để thư giãn; tốt nhất bạn có thể làm là chụp nó và đăng ký nó trên đối tượng tác vụ, nếu có một đối tượng như vậy. Tuy nhiên, nó đánh bại sức mạnh chính của các ngoại lệ: bạn phải kiểm tra chúng và bạn có thể bỏ qua chúng mà không cần bất kỳ nỗ lực bổ sung nào , trong khi trong mã đơn luồng, một ngoại lệ sẽ nhất thiết kích hoạt các hành động thích hợp (ngay cả khi nó có nghĩa là chấm dứt chương trình của bạn).

Làm thế nào để triển khai ngôn ngữ hoặc thư viện hỗ trợ lỗi trong mã song song?


2
Điều này không nên thuộc về stackoverflow ?
Graviton

@Ngu Soon Hui Đó là chủ quan và đó là về các tính năng không nhất thiết tồn tại, vì vậy tôi nghĩ rằng nó thuộc về nơi này.
zneak

Nhưng đó là về lập trình chứ không phải lập trình viên. :)
bzlm

1
@bzlm FAQ cho biết "Lập trình viên - Stack Exchange dành cho các lập trình viên chuyên nghiệp, những người quan tâm đến các cuộc thảo luận chủ quan về phát triển phần mềm." và SO rõ ràng không khuyến khích các cuộc thảo luận chủ quan.
zneak

Câu trả lời:


2

Tôi khá thích các cuộc gọi lại cho các lỗi có thể được xử lý. Và chúng có thể được chế tạo để hoạt động tốt không đồng bộ ...

Nhưng đối với các lỗi không thể xử lý, các lỗi thực sự đặc biệt , tôi muốn xem các thông tin liên quan được lưu và chương trình chấm dứt. Vì việc này thường được thực hiện thông qua một số loại xử lý lỗi toàn cầu, nên tôi thấy không cần phải ngoại lệ thành thứ gì đó phù hợp với điều này - nhưng hỗ trợ nền tảng tốt hơn để phát hiện các lỗi nghiêm trọng và tạo ra các lỗi bộ nhớ, v.v.


Tôi gọi lại lần thứ hai. Ý tưởng trên có vẻ khá hoàn hảo với tôi.
Pax Noctis

-2

Có vẻ như bạn sẽ muốn đảm bảo rằng tác vụ xử lý các ngoại lệ của chính nó, và sau đó trả lại một cái gì đó cho chương trình gọi biết rằng chuỗi cần phải được tắt. Sau đó, nó sẽ có logic để xử lý kết quả của tất cả các luồng, biết rằng một số trong các luồng đó đã thất bại.


5
"Trả lại một cái gì đó" - cho ai? Người gọi đã chuyển đi.
Đánh dấu H

Như @sparkie đã nói, bạn không thể làm điều đó. Ngay cả khi bạn giữ ngăn xếp cuộc gọi làm gốc cho coroutine, người gọi có thể sẽ ở rất xa. Như tôi đã đề cập, trường hợp ngoại lệ được thiết kế để họ dừng lại bạn chương trình , giờ đây . Tự mình kiểm tra nó sau đó đánh bại nó hoàn toàn vì các ngoại lệ có thể không được chú ý.
zneak

@Zneak, tôi cho rằng khi tôi đề cập đến các ngoại lệ tôi đã không sử dụng định nghĩa (tiêu chuẩn) của bạn, tôi chỉ có nghĩa là lỗi đã bị bắt. Sau khi bất kỳ chức năng nào kết thúc, nó phải trở về một nơi nào đó, tại thời điểm đó, "ngoại lệ" / lỗi có thể được xử lý (ở mức đó). Tôi không chắc tại sao các bạn lại đề cập đến chương trình gọi điện ở xa, mọi giá trị trả về từ hàm phải được xử lý trong một ngày nào đó. Tôi nhận ra rằng điều này sẽ không hoạt động gần như là tốt nếu kết quả của các luồng kết nối với nhau một cách phụ thuộc.

1
Không phải tất cả các nhiệm vụ song song "trở lại" ở đâu đó. Chẳng hạn, bạn chỉ có thể ủy thác một tác vụ dài cho một luồng riêng trong khi thực hiện một thao tác khác trên luồng chính, (không đúng) mà không bao giờ tự hỏi liệu nó có hoàn thành chính xác không. Chẳng hạn, tôi có thể viết một phần mềm phiên bản hình ảnh ghi vào các tệp từ một luồng phụ và quay lại từ hộp thoại lưu ngay khi tác vụ được bắt đầu. Tôi sẽ không cần giá trị trả về, cho dù đó là gì, cho bất kỳ hoạt động nào khác, vì vậy ngoại trừ lỗi, không có lý do để kiểm tra giá trị đó.
zneak
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.