Pertanyaan saya: aplikasi macam apa yang membutuhkan banyak utas eksekusi bersamaan?
1) Fakta bahwa suatu bahasa "timbangan" berarti ada sedikit kesempatan Anda harus membuang bahasa itu ketika keadaan menjadi semakin rumit. (Ini disebut konsep "Produk Utuh".) Banyak orang membuang Apache untuk Nginx karena alasan ini. Jika Anda berada di dekat "batas keras" yang dikenakan oleh overhead thread, Anda akan merasa takut dan mulai memikirkan cara untuk melewatinya. Situs web tidak pernah dapat memprediksi berapa banyak lalu lintas yang akan mereka peroleh, jadi menghabiskan sedikit waktu untuk membuat hal-hal yang dapat diskalakan adalah masuk akal.
2) Satu goroutine per permintaan hanya permulaan. Ada banyak alasan untuk menggunakan goroutine secara internal.
- Pertimbangkan aplikasi web dengan permintaan simultan 100-an, tetapi setiap permintaan menghasilkan 100-an permintaan back-end. Contoh nyata adalah agregator mesin pencari. Tetapi hampir semua aplikasi dapat membuat goroutine untuk setiap "area" di layar, lalu menghasilkannya secara independen, bukan berurutan. Misalnya, setiap halaman di Amazon.com terdiri dari 150+ permintaan back-end, disusun hanya untuk Anda. Anda tidak melihat karena mereka paralel, tidak berurutan, dan masing-masing "area" adalah layanan web itu sendiri.
- Pertimbangkan aplikasi apa pun yang keandalan dan latensinya sangat penting. Anda mungkin ingin setiap permintaan masuk untuk memadamkan beberapa permintaan back-end, dan mengembalikan data mana yang lebih dulu kembali .
- Pertimbangkan "klien bergabung" yang dilakukan di aplikasi Anda. Alih-alih mengatakan "untuk setiap elemen, dapatkan data", Anda dapat memintal sekelompok goroutine. Jika Anda memiliki banyak DB budak yang harus di-query, secara ajaib Anda akan lebih cepat N kali. Jika tidak, itu tidak akan lebih lambat.
hit semakin berkurang saat jumlah utas / proses jauh lebih besar dari jumlah inti fisik
Kinerja bukan satu-satunya alasan untuk memecah program menjadi CSP . Ini sebenarnya dapat membuat program lebih mudah dipahami, dan beberapa masalah dapat diselesaikan dengan kode yang jauh lebih sedikit.
Seperti pada slide yang ditautkan di atas, memiliki konkurensi dalam kode Anda adalah cara untuk mengatur masalahnya. Tidak memiliki goroutine sama seperti tidak memiliki struktur data Peta / Dictonary / Hash dalam bahasa Anda. Anda bisa bertahan tanpanya. Tetapi begitu Anda memilikinya, Anda mulai menggunakannya di mana-mana, dan itu benar-benar menyederhanakan program Anda.
Di masa lalu, ini berarti pemrograman multithreaded "roll your own". Tapi ini rumit dan berbahaya - masih belum ada banyak alat untuk memastikan Anda tidak membuat balapan. Dan bagaimana Anda mencegah manajer masa depan melakukan kesalahan? Jika Anda melihat program besar / kompleks, Anda akan melihat mereka menghabiskan BANYAK sumber daya ke arah itu.
Karena concurrency bukan bagian kelas dari sebagian besar bahasa, programmer saat ini memiliki titik buta mengapa hal itu berguna bagi mereka. Ini hanya akan menjadi lebih jelas karena setiap ponsel dan jam tangan mengarah ke 1000 core. Pergi kapal dengan alat detektor ras built-in.