Bagaimana saya bisa tahu jika saya menggunakan multi-threading?

15

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 Bs dan masing-masing Bdapat dikonversi ke beberapa Cs.

Saya hanya tertarik merawat Cs.

Saya bisa menulis ini dengan cukup mudah dengan beberapa fungsi konversi. Tapi saya menemukan diri saya menerapkannya dengan utas, tiga antrian ( queue_a, queue_bdan queue_c). Ada dua utas yang melakukan konversi yang berbeda, dan satu pekerja:

  • ConverterAmembaca dari queue_adan menulis kequeue_b
  • ConverterBmembaca dari queue_bdan menulis kequeue_c
  • Worker menangani setiap elemen dari queue_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" As atau baru Bdan 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.

exhuma
sumber
5
Saya pikir pertanyaan ini perlu dipersingkat sedikit untuk dipotong untuk mengejar. Judulnya juga menyesatkan - kedengarannya seperti Anda akan meluncurkan kata-kata kasar (meskipun Anda tidak). Mungkin Anda harus menanyakan sesuatu yang lebih dekat ke "Bagaimana saya bisa tahu jika saya terlalu banyak menggunakan multithreading?"
KChaloux
@KChaloux Saya setuju. Saya telah mengeditnya, dan berharap itu menangkap pikiran saya sedikit lebih baik.
exhuma
4
@exhuma Luar Biasa. -1 Anda menjadi +1
KChaloux
3
@KChaloux ... perbedaan kunjungan ke toilet dapat membuat proses pemikiran Anda ... :)
exhuma
Buku PDF online ini, Buku Panduan Optimalisasi Dewasa (baru diterbitkan beberapa hari yang lalu) berbicara tentang efek sistematis di mana dampak modul terhadap kinerja sistem secara keseluruhan kadang-kadang dapat melebihi sebagian kecil dari waktu eksekusi modul.
rwong

Jawaban:

16

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).

Neil
sumber
Anda membuat poin menarik. Dalam kasus saya, pipa konversi bukan tentang kinerja. Ini tentang kesederhanaan kode / keterbacaan. Utas pekerja adalah tentang kinerja. Setiap tugas akhir berjalan pada mesin jarak jauh, dan mengirimkan beberapa pekerjaan membuatnya berjalan lebih cepat.
exhuma
2
@exhuma Selain eksekusi paralel melalui beberapa utas, Anda juga bisa menggunakan teknik async seperti Futures / Promises, atau gaya berorientasi panggilan balik. Perhatikan bahwa Anda dapat memodelkan pipa dengan merantai iterator / stream; tidak perlu menggunakan utas - kecuali jika Anda ingin menggunakan banyak CPU (Dalam kode jaringan, ini hampir tidak pernah terjadi)
amon
@exhuma Ya, utas membantu kinerja secara umum. Maksud saya adalah jika Anda tidak melakukannya karena terlalu lambat, maka Anda harus melakukannya karena itu membantu Anda menulis program Anda. Optimalisasi harus selalu datang kemudian. Bahkan mungkin menghapus thread dari program Anda mengoptimalkannya (meskipun itu tidak terjadi pada kebanyakan programmer).
Neil
OT: Saya suka avatar Anda. Buat aku tersenyum.
Marjan Venema
@exhuma, saya setuju dengan jawaban ini tetapi saya akan menambahkan bahwa jika Anda akan menggunakan utas untuk kesederhanaan kode, itu baik-baik saja, tetapi sangat berhati-hati bahwa Anda memahami keselamatan utas dan potensi gotcha dengan beberapa utas. Apa yang tampak seperti sepotong kode multithreaded sederhana dapat dengan mudah memiliki kondisi ras tersembunyi yang dapat menyebabkan bermacam-macam bug yang sangat sulit dilacak.
Ben Lee