Threading secara signifikan mengurangi waktu eksekusi suatu program. Pelajari cara mengimplementasikan threading dengan Python.
Waktu eksekusi adalah salah satu ukuran umum dari efisiensi suatu program. Semakin cepat waktu eksekusi semakin baik programnya. Threading adalah teknik yang memungkinkan suatu program untuk melakukan banyak tugas atau proses secara bersamaan.
Anda akan belajar bagaimana menggunakan built-in Python threading modul dan concurrent.features modul. Kedua modul ini menawarkan cara sederhana untuk membuat dan mengelola utas
Pentingnya Threading
Threading mengurangi jumlah waktu yang dibutuhkan program untuk menyelesaikan pekerjaan. Jika pekerjaan berisi beberapa tugas independen, Anda dapat menggunakan threading untuk menjalankan tugas secara bersamaan, mengurangi waktu tunggu program untuk menyelesaikan satu tugas sebelum beralih ke tugas berikutnya.
Misalnya, program yang mengunduh banyak file gambar dari internet. Program ini dapat memanfaatkan threading untuk mengunduh file secara paralel daripada satu per satu. Ini menghilangkan waktu program harus menunggu proses pengunduhan satu file selesai sebelum pindah ke yang berikutnya.
Program Awal Sebelum Threading
Fungsi dalam program berikut mewakili tugas. Tugasnya adalah menjeda eksekusi program selama satu detik. Program memanggil fungsi dua kali sehingga membuat dua tugas. Ini kemudian menghitung waktu yang diperlukan untuk menjalankan seluruh program dan kemudian menampilkannya di layar.
impor waktu
waktu_mulai = waktu.perf_counter()
defberhenti sebentar():
mencetak('Tidur 1 detik...')
waktu tidur(1)
mencetak('Selesai Tidur...')
berhenti sebentar()
berhenti sebentar()
waktu_selesai = waktu.perf_counter()
mencetak(f'Selesai {round (finish_time - start_time, 2)} detik')
Keluaran menunjukkan bahwa program membutuhkan waktu 2,01 detik untuk dieksekusi. Setiap tugas membutuhkan waktu satu detik dan kode lainnya membutuhkan waktu 0,01 detik untuk dieksekusi.
Anda dapat menggunakan threading untuk menjalankan kedua tugas secara bersamaan. Ini akan membutuhkan waktu satu detik untuk mengeksekusi kedua tugas.
Menerapkan Threading Menggunakan Modul threading
Untuk memodifikasi kode awal untuk mengimplementasikan threading, impor file threading modul. Buat dua utas, utas_1 Dan benang_2 menggunakan Benang kelas. Panggil awal metode pada setiap utas untuk memulai eksekusinya. Panggil bergabung metode pada setiap utas untuk menunggu eksekusi mereka selesai sebelum sisa program dieksekusi.
impor waktu
impor threading
waktu_mulai = waktu.perf_counter()defberhenti sebentar():
mencetak('Tidur 1 detik...')
waktu tidur(1)
mencetak('Selesai Tidur...')thread_1 = threading. Utas (target=jeda)
thread_2 = utas. Utas (target=jeda)utas_1.mulai()
utas_2.mulai()utas_1.bergabung()
utas_2.bergabung()
waktu_selesai = waktu.perf_counter()
mencetak(f'Selesai {round (finish_time - start_time, 2)} detik')
Program akan menjalankan kedua utas secara bersamaan. Ini akan mengurangi jumlah waktu yang dibutuhkan untuk menyelesaikan kedua tugas.
Output menunjukkan waktu yang dibutuhkan untuk menjalankan tugas yang sama adalah sekitar satu detik. Ini adalah setengah dari waktu yang dibutuhkan program awal.
Menerapkan Threading Menggunakan Modul concurrent.futures
Python 3.2 melihat pengenalan concurrent.futures modul. Modul ini menyediakan antarmuka tingkat tinggi untuk menjalankan tugas asinkron menggunakan utas. Ini memberikan cara yang lebih sederhana untuk menjalankan tugas secara paralel.
Untuk memodifikasi program awal untuk menggunakan threading, impor modul concurrent.features. Menggunakan ThreadPoolExecutor kelas dari modul concurrent.futures untuk membuat kumpulan utas. Kirimkan berhenti sebentar berfungsi untuk kolam dua kali. Itu kirim pengembalian metode a masa depan objek yang mewakili hasil pemanggilan fungsi.
Ulangi selama berjangka dan mencetak hasilnya menggunakan hasil metode.
impor waktu
impor concurrent.futureswaktu_mulai = waktu.perf_counter()
defberhenti sebentar():
mencetak('Tidur 1 detik...')
waktu tidur(1)
kembali'Selesai Tidur...'dengan concurrent.futures. ThreadPoolExecutor() sebagai pelaksana:
hasil = [pelaksana.kirim (jeda) untuk _ di dalam jangkauan(2)]
untuk F di dalam concurrent.futures.as_completed (hasil):
cetak (f.result())waktu_selesai = waktu.perf_counter()
mencetak(f'Selesai {round (finish_time - start_time, 2)} detik')
Modul concurrent.features menangani memulai dan menggabungkan utas untuk Anda. Ini membuat kode Anda lebih bersih.
Outputnya identik dengan modul threading. Modul threading berguna untuk kasus sederhana di mana Anda perlu menjalankan beberapa utas secara paralel. Di sisi lain, modul concurrent.futures berguna untuk kasus yang lebih kompleks di mana Anda harus menjalankan banyak tugas secara bersamaan.
Menggunakan Threading dalam Skenario Dunia Nyata
Menggunakan utas untuk menjalankan program di atas mengurangi waktu satu detik. Di dunia nyata, utas menghemat lebih banyak waktu. Buat program yang mengunduh gambar dari internet. Mulai oleh menciptakan lingkungan virtual baru. Jalankan perintah berikut di terminal untuk menginstal permintaan perpustakaan:
permintaan instalasi pip
Pustaka permintaan akan memungkinkan Anda mengirim permintaan HTTP. Impor pustaka permintaan dan pustaka waktu.
impor permintaan
impor waktu
Buat daftar URL gambar yang ingin Anda unduh. Biarkan setidaknya sepuluh sehingga Anda dapat melihat perbedaan yang signifikan saat Anda menerapkan threading.
img_url = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]
Ulangi daftar URL mengunduh setiap gambar ke dalam folder yang sama yang berisi proyek Anda. Tampilkan waktu yang diperlukan untuk mengunduh gambar dengan mengurangi waktu selesai dari waktu mulai.
waktu_mulai = waktu.perf_counter()
untuk img_url di dalam img_url:
img_bytes = permintaan.dapatkan (img_url).konten
img_name = img_url.split('/')[3]
img_name = F'{nama_img}.jpg'
dengan buka (nama_img, 'wb') sebagai img_file:
img_file.tulis (img_bytes)
mencetak(F'{nama_img} telah diunduh...')
waktu_selesai = waktu.perf_counter()
mencetak(f'Selesai {finish_time - start_time} detik')
Program ini membutuhkan waktu sekitar 22 detik untuk mengunduh 12 gambar. Ini mungkin berbeda untuk Anda karena waktu yang dibutuhkan untuk mengunduh gambar juga tergantung pada kecepatan internet Anda.
Ubah program untuk menggunakan threading menggunakan modul concurrent.features. Alih-alih loop, gunakan fungsi. Ini adalah fungsi yang akan Anda berikan ke pelaksana contoh.
impor permintaan
impor waktu
impor concurrent.futuresimg_url = [
' https://images.unsplash.com/photo-1524429656589-6633a470097c',
' https://images.unsplash.com/photo-1530224264768-7ff8c1789d79',
' https://images.unsplash.com/photo-1564135624576-c5c88640f235',
' https://images.unsplash.com/photo-1541698444083-023c97d3f4b6',
' https://images.unsplash.com/photo-1522364723953-452d3431c267',
' https://images.unsplash.com/photo-1513938709626-033611b8cc03',
' https://images.unsplash.com/photo-1507143550189-fed454f93097',
' https://images.unsplash.com/photo-1493976040374-85c8e12f0c0e',
' https://images.unsplash.com/photo-1504198453319-5ce911bafcde',
' https://images.unsplash.com/photo-1530122037265-a5f1f91d3b99',
' https://images.unsplash.com/photo-1516972810927-80185027ca84',
' https://images.unsplash.com/photo-1550439062-609e1531270e',
]waktu_mulai = waktu.perf_counter()
defdownload_image(img_url):
img_bytes = permintaan.dapatkan (img_url).konten
img_name = img_url.split('/')[3]
img_name = F'{nama_img}.jpg'
dengan buka (nama_img, 'wb') sebagai img_file:
img_file.tulis (img_bytes)
mencetak(F'{nama_img} telah diunduh...')dengan concurrent.futures. ThreadPoolExecutor() sebagai pelaksana:
pelaksana.peta (download_image, img_urls)waktu_selesai = waktu.perf_counter()
mencetak(f'Selesai {finish_time-start_time} detik')
Setelah memperkenalkan threading. Waktu berkurang secara signifikan. Hanya butuh 4 detik untuk menyelesaikan eksekusi program.
Skenario Cocok untuk Threading
Beberapa skenario yang cocok untuk threading adalah:
- tugas terikat I/O: Jika program menghabiskan sebagian besar waktunya untuk menunggu operasi input atau output selesai. Threading dapat meningkatkan kinerja dengan mengizinkan tugas lain dijalankan sambil menunggu operasi I/O selesai.
- Mengikis web: Pengikisan web melibatkan pembuatan permintaan HTTP dan penguraian tanggapan HTML. Threading membantu mempercepat proses dengan memungkinkan Anda membuat beberapa permintaan secara bersamaan.
- tugas yang terikat CPU: Threading dapat membantu meningkatkan kinerja dengan memungkinkan beberapa tugas dijalankan secara paralel.
Biasakan Diri Anda Dengan Threading dalam Bahasa Lain
Python bukan satu-satunya bahasa yang mendukung threading. Sebagian besar bahasa pemrograman mendukung beberapa bentuk threading. Penting untuk membiasakan diri dengan penerapan utas dalam bahasa lain. Ini membekali Anda dengan keterampilan yang diperlukan untuk mengatasi berbagai skenario di mana threading mungkin berlaku.