Saat ini saya merasa seperti menggunakan multi-threading secara berlebihan.
Saya memiliki 3 jenis data, A, B dan C.
Masing A
- masing dapat dikonversi ke beberapa B
s dan masing-masing B
dapat dikonversi ke beberapa C
s.
Saya hanya tertarik merawat C
s.
Saya bisa menulis ini dengan cukup mudah dengan beberapa fungsi konversi. Tapi saya menemukan diri saya menerapkannya dengan utas, tiga antrian ( queue_a
, queue_b
dan queue_c
). Ada dua utas yang melakukan konversi yang berbeda, dan satu pekerja:
ConverterA
membaca dariqueue_a
dan menulis kequeue_b
ConverterB
membaca dariqueue_b
dan menulis kequeue_c
Worker
menangani setiap elemen dariqueue_c
Konversi cukup biasa, dan saya tidak tahu apakah model ini terlalu berbelit-belit. Tetapi tampaknya sangat kuat bagi saya. Setiap "konverter" dapat mulai bekerja bahkan sebelum data tiba di antrian, dan kapan saja dalam kode saya dapat "mengirimkan" A
s atau baru B
dan itu akan memicu pipa konversi yang pada gilirannya akan memicu pekerjaan oleh pekerja benang.
Bahkan kode yang dihasilkan terlihat lebih sederhana. Tetapi saya masih tidak yakin apakah saya menyalahgunakan utas untuk sesuatu yang sederhana.
sumber
Jawaban:
Hampir selalu lebih sederhana untuk berpikir secara berurutan, dan kemudian memodifikasi logika itu untuk bekerja lebih baik menggunakan utas. Dan, seperti ungkapan, "Jika tidak rusak, jangan memperbaikinya." Sebagian besar programmer tidak menggunakan utas hanya karena tidak perlu menggunakannya.
Jika Anda merasa lebih nyaman menggunakannya, lebih banyak kekuatan untuk Anda. Namun, ketahuilah bahwa jika utas tidak menawarkan peningkatan kecepatan dengan menghilangkan hambatan, mereka hampir pasti memperlambat program Anda.
Juga pertimbangkan bahwa sistem yang mendedikasikan hanya satu CPU untuk suatu proses akan mensimulasikan banyak utas dengan satu utas tunggal untuk menghemat sumber daya (ini tidak sering terjadi pada komputer modern, meskipun aplikasi telepon pintar masih sangat banyak mengalami pelecehan ini). Dalam hal ini, bahkan jika Anda menghilangkan hambatan melalui penggunaan utas, itu sebenarnya akan lebih lambat daripada jika Anda tidak menggunakan utas sama sekali.
Dan, mungkin alasan paling halus untuk menggunakan kehati-hatian dalam menggunakan utas, tetapi tentu bukan yang paling penting, utas memiliki kecenderungan untuk melakukan apa yang tidak Anda harapkan. Ya, jika Anda mengambil tindakan pencegahan, Anda seharusnya baik-baik saja. Ya, jika utas Anda tidak menulis ke variabel yang dibagi di antara utas, Anda seharusnya baik-baik saja. Karena itu, bug yang berhubungan dengan utas sangat sulit ditemukan. Karena saya berpendapat bahwa seorang programmer tidak dapat sepenuhnya menghilangkan kemungkinan untuk membuat bug dalam kode dan oleh karena itu seorang programmer harus mengambil langkah-langkah untuk melindungi terhadap kemungkinan bug daripada berfokus pada menghilangkannya secara total, Anda harus menerapkan ide ini ke hard- untuk menemukan bug utas juga. Dengan kata lain, ketahuilah bahwa di samping upaya terbaik Anda,
Jadi, sebaiknya Anda tetap menggunakan utas? Pengetahuan benang yang sehat tentu bukan hal yang buruk, terutama jika Anda menjadi ahli. Namun, pergerakan akhir-akhir ini mengarah ke bahasa single-threaded seperti node.js. Salah satu keuntungan utama dari memiliki utas tunggal adalah mudah untuk menskalakan dan optimasi tertentu dapat dilakukan jika Anda tahu bahwa instruksi diharapkan untuk dijalankan secara berurutan (bahkan jika optimasi dapat berarti bahwa instruksi yang dapat dijalankan secara paralel dapat dijalankan secara tidak sinkron).
Yang mengatakan, saya katakan lakukan apa yang paling nyaman untuk Anda. Dalam pengalaman saya, menulis sebuah program yang Anda pahami memiliki prioritas lebih tinggi daripada membuatnya bekerja lebih cepat. Pastikan untuk menggunakan utas ketika Anda pikir itu membantu Anda menulis program, dan bukan karena Anda ingin bekerja lebih cepat, karena Anda tidak perlu terlalu khawatir tentang kinerja saat Anda menulis program (pengoptimalan itu penting, tetapi itu juga bisa menunggu).
sumber