Apa yang akan menjadi cara terbaik untuk menangani kesalahan dalam program paralel?

11

Dengan algoritma paralel yang mengetuk pintu, mungkin saat yang tepat untuk memikirkan penanganan kesalahan.

Jadi pada awalnya ada kode kesalahan. Mereka payah. Itu gratis untuk mengabaikan mereka, sehingga Anda bisa gagal terlambat dan menghasilkan kode sulit untuk debug.

Kemudian muncul pengecualian. Mereka dibuat mustahil untuk diabaikan begitu mereka muncul, dan kebanyakan orang (kecuali Joel) lebih menyukainya.

Dan sekarang kami punya perpustakaan yang membantu kode paralel. Masalahnya adalah, Anda tidak dapat menangani pengecualian dalam kode paralel semudah yang Anda bisa dengan kode non-paralel. Jika Anda meluncurkan tugas secara tidak sinkron dan melempar pengecualian, tidak ada jejak tumpukan melewatinya untuk melepas lelah; terbaik yang dapat Anda lakukan adalah menangkapnya dan mendaftarkannya pada objek tugas, jika ada objek seperti itu. Namun, itu mengalahkan kekuatan utama dari pengecualian: Anda harus memeriksanya dan Anda dapat mengabaikannya tanpa upaya tambahan , sedangkan dalam kode single-threaded, sebuah perkecualian akan memicu tindakan yang tepat (bahkan jika itu berarti menghentikan program Anda).

Bagaimana seharusnya implementasi bahasa atau perpustakaan mendukung kesalahan dalam kode paralel?

zneak
sumber
2
Bukankah ini seharusnya milik stackoverflow ?
Graviton
@Ngu Soon Hui Ini subjektif dan ini tentang fitur yang belum tentu ada, jadi saya pikir itu milik di sini.
zneak
Tapi ini tentang pemrograman, bukan programmer. :)
bzlm
1
@bzlm FAQ mengatakan "Programmer - Stack Exchange adalah untuk programmer ahli yang tertarik dalam diskusi subjektif tentang pengembangan perangkat lunak." dan SO secara eksplisit mencegah diskusi subyektif.
zneak

Jawaban:

2

Saya lebih suka panggilan balik untuk kesalahan yang dapat ditangani. Dan mereka dapat dibuat bekerja dengan baik secara asinkron ...

Tetapi untuk kesalahan yang tidak dapat ditangani, kesalahan yang benar-benar luar biasa , saya lebih suka melihat informasi yang relevan disimpan dan program dihentikan. Karena ini biasanya dilakukan melalui semacam penanganan kesalahan global, saya melihat tidak perlu mengubah pengecualian menjadi sesuatu yang berfungsi untuk ini - tetapi dukungan platform yang lebih baik untuk mendeteksi kesalahan kritis dan menghasilkan dump memori, dll. Akan menyenangkan.

Shog9
sumber
Saya panggilan balik kedua. Gagasan di atas tampaknya cukup sempurna bagi saya.
Pax Noctis
-2

Sepertinya Anda ingin memastikan bahwa tugas yang ditangani itu sendiri pengecualian, dan kemudian mengembalikan sesuatu yang membuat program panggilan tahu bahwa utas perlu ditutup. Maka akan memiliki logika untuk memproses hasil dari semua utas, mengetahui bahwa beberapa utas tersebut telah gagal.


sumber
5
"mengembalikan sesuatu" - kepada siapa? Penelepon sudah pindah.
Mark H
Seperti yang dikatakan @sparkie, Anda tidak bisa begitu saja melakukannya. Bahkan jika Anda menyimpan tumpukan panggilan sebagai root untuk coroutine, pemanggil mungkin akan jauh, jauh sekali. Seperti yang saya sebutkan, pengecualian dirancang sehingga mereka menghentikan program Anda , sekarang . Memeriksanya sendiri kemudian mengalahkannya sepenuhnya karena pengecualian bisa tanpa disadari.
zneak
@Neak, saya kira ketika saya menyebutkan pengecualian saya tidak menggunakan definisi (standar) Anda, saya hanya berarti kesalahan tertangkap. Setelah fungsi apa pun selesai, ia harus kembali ke suatu tempat, pada saat itu "pengecualian" / kesalahan dapat ditangani (pada tingkat itu). Saya tidak yakin mengapa kalian mengacu pada program panggilan yang jauh, nilai pengembalian dari fungsi harus ditangani di suatu tempat. Saya menyadari bahwa ini tidak akan bekerja hampir juga jika hasil dari benang saling bertautan satu sama lain.
1
Tidak semua tugas paralel "kembali" ke suatu tempat. Misalnya, Anda bisa mendelegasikan tugas panjang ke utas terpisah saat melakukan sesuatu yang lain pada utas utama, (salah) tanpa pernah bertanya-tanya apakah itu selesai dengan benar. Misalnya, saya bisa menulis perangkat lunak edisi gambar yang menulis ke file dari utas sekunder, dan kembali dari dialog simpan segera setelah tugas dimulai. Saya tidak akan memerlukan nilai kembali, apa pun itu, untuk operasi lebih lanjut, jadi kecuali untuk kesalahan, tidak ada alasan untuk memeriksanya.
zneak