Apa perbedaan antara menggunakan utas baru dan utas dari kumpulan utas? Manfaat kinerja apa yang ada dan mengapa saya harus mempertimbangkan untuk menggunakan utas dari kumpulan daripada yang saya buat secara eksplisit? Saya memikirkan secara khusus. NET di sini, tetapi contoh umum baik-baik saja.
sumber
Threadpool yang dikelola .NET: -
Ada implementasi kumpulan thread lain yang mungkin lebih sesuai untuk operasi yang berjalan lama.
Secara khusus, gunakan kumpulan thread untuk mencegah aplikasi Anda membuat terlalu banyak thread. Fitur terpenting dari threadpool adalah antrean pekerjaan. Artinya, setelah mesin Anda cukup sibuk, threadpool akan mengantrekan permintaan daripada segera menelurkan lebih banyak utas.
Jadi, jika Anda akan membuat sejumlah kecil utas yang dibatasi, buatlah sendiri. Jika Anda tidak dapat menentukan di muka berapa banyak utas yang dapat dibuat (misalnya, dibuat sebagai respons terhadap IO yang masuk), dan pekerjaan mereka akan berumur pendek, gunakan threadpool. Jika Anda tidak tahu berapa banyak, tetapi pekerjaan mereka akan berjalan lama, tidak ada apa pun di platform yang dapat membantu Anda - tetapi Anda mungkin dapat menemukan implementasi threadpool alternatif yang sesuai.
sumber
juga
memunculkan thread Foreground yang tidak akan mati jika Anda menutup program Anda. Utas ThreadPool adalah utas latar belakang yang mati saat Anda menutup aplikasi.
sumber
Saya penasaran tentang penggunaan sumber daya relatif untuk ini dan dan menjalankan benchmark pada laptop Intel i5 dual-core 2012 saya menggunakan rilis .net 4.0 yang dibangun di windows 8. Thread Pools mengambil rata-rata 0,035ms untuk memulai di mana Threads mengambil rata-rata 5,06 MS. Dengan kata lain Utas di kumpulan dimulai sekitar 300x lebih cepat untuk sejumlah besar utas berumur pendek. Setidaknya dalam rentang yang diuji (100-2000) utas, total waktu per utas tampak cukup konstan.
Ini adalah kode yang dijadikan tolok ukur:
for (int i = 0; i < ThreadCount; i++) { Task.Run(() => { }); } for (int i = 0; i < ThreadCount; i++) { var t = new Thread(() => { }); t.Start(); }
sumber
Periksa di sini untuk utas sebelumnya:
Kapan saya tidak boleh menggunakan ThreadPool di .Net?
Kesimpulannya adalah Threadpool bagus jika Anda perlu menelurkan banyak utas berumur pendek, sedangkan menggunakan utas memberi Anda sedikit lebih banyak kendali.
sumber
Penyimpanan lokal benang bukanlah ide yang baik dengan kumpulan benang. Ini memberi benang sebuah "identitas"; tidak semua utas sama lagi. Sekarang kumpulan utas sangat berguna jika Anda hanya membutuhkan sekumpulan utas yang identik, siap untuk melakukan pekerjaan Anda tanpa overhead pembuatan.
sumber
Jika Anda membutuhkan banyak utas, Anda mungkin ingin menggunakan ThreadPool. Mereka menggunakan kembali utas sehingga menghemat biaya pembuatan utas.
Jika Anda hanya membutuhkan satu utas untuk menyelesaikan sesuatu, Utas mungkin paling mudah.
sumber
Kebutuhan utama utas theadpool adalah untuk menangani tugas-tugas kecil pendek yang diharapkan selesai hampir seketika. Penangan interupsi perangkat keras sering kali berjalan dalam konteks penumpukan yang tidak sesuai untuk kode non-kernel, tetapi penangan interupsi perangkat keras mungkin menemukan bahwa callback penyelesaian I / O mode pengguna harus dijalankan sesegera mungkin. Membuat utas baru untuk tujuan menjalankan hal seperti itu akan sangat berlebihan. Memiliki beberapa utas yang dibuat sebelumnya yang dapat dikirim untuk menjalankan callback penyelesaian I / O atau hal serupa lainnya jauh lebih efisien.
Aspek kunci dari utas tersebut adalah bahwa jika metode penyelesaian I / O selalu selesai pada dasarnya secara instan dan tidak pernah memblokir, dan jumlah utas yang saat ini menjalankan metode tersebut setidaknya sama dengan jumlah prosesor, satu-satunya cara utas lainnya dapat berjalan sebelum salah satu metode yang disebutkan di atas selesai jika salah satu blok metode lain atau waktu eksekusinya melebihi potongan waktu threading normal; tidak satu pun dari hal tersebut yang akan sering terjadi jika kumpulan utas digunakan sebagaimana mestinya.
Jika suatu metode tidak dapat diharapkan untuk keluar dalam 100 md atau lebih dari saat mulai dieksekusi, metode tersebut harus dijalankan melalui beberapa cara selain kumpulan utas utama. Jika seseorang memiliki banyak tugas untuk dilakukan yang memerlukan banyak CPU tetapi tidak akan diblokir, mungkin berguna untuk mengirimkannya menggunakan kumpulan utas aplikasi (satu per inti CPU) yang terpisah dari threadpool "utama", karena menggunakan lebih banyak utas daripada inti akan menjadi kontraproduktif saat menjalankan tugas-tugas intensif CPU yang tidak memblokir. Namun, jika sebuah metode membutuhkan waktu satu detik atau lebih untuk dieksekusi, dan akan menghabiskan sebagian besar waktunya diblokir, metode tersebut kemungkinan besar harus dijalankan di thread khusus, dan hampir pasti tidak dijalankan di thread main-threadpool. Jika operasi yang berjalan lama perlu dipicu oleh sesuatu seperti callback I / O,
sumber
Secara umum (saya belum pernah menggunakan .NET), kumpulan utas akan digunakan untuk tujuan manajemen sumber daya. Ini memungkinkan batasan untuk dikonfigurasi ke dalam perangkat lunak Anda. Ini juga dapat dilakukan untuk alasan kinerja, karena pembuatan utas baru mungkin mahal.
Mungkin juga ada alasan spesifik sistem. Di Java (sekali lagi saya tidak tahu apakah ini berlaku untuk .NET), pengelola utas dapat menerapkan variabel khusus utas karena setiap utas ditarik dari kumpulan, dan membatalkannya ketika dikembalikan (cara umum untuk meneruskan sesuatu seperti sebuah identitas).
Contoh kendala: Saya hanya memiliki 10 koneksi db, jadi saya hanya mengizinkan 10 utas pekerja untuk mengakses database.
Ini tidak berarti bahwa Anda tidak boleh membuat utas Anda sendiri, tetapi ada beberapa kondisi yang membuat Anda dapat menggunakan kumpulan.
sumber
Menggunakan pool adalah ide yang bagus, jika Anda tidak tahu atau tidak bisa mengontrol berapa banyak thread yang akan dibuat.
Hanya memiliki masalah dengan formulir yang menggunakan utas untuk memperbarui beberapa bidang dari database pada peristiwa posisi berubah dari kontrol daftar (hindari freez). Butuh waktu 5 menit bagi pengguna saya untuk mengalami kesalahan dari database (terlalu banyak koneksi dengan Access) karena dia mengubah posisi daftar terlalu cepat ...
Saya tahu ada cara lain untuk menyelesaikan masalah dasar (termasuk tidak menggunakan akses) tetapi penggabungan adalah awal yang baik.
sumber
Benang :
Thread-Pool :
sumber