Farih.co.id
Home Programming Cara Menjalankan Kode Python Secara Bersamaan Menggunakan Threads

Cara Menjalankan Kode Python Secara Bersamaan Menggunakan Threads

run code concurrently using threads featured image

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.

 import time

start_time = time.perf_counter()

def pause():
    print('Sleeping 1 second...')
    time.sleep(1)
    print('Done Sleeping...')

pause()
pause()
finish_time = time.perf_counter()
print(f'Finished in {round(finish_time - start_time, 2)} second(s)')

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.

output dari program menunjukkan waktu yang dibutuhkan untuk menjalankan program

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.

 import time
import threading
start_time = time.perf_counter()

def pause():
    print('Sleeping 1 second...')
    time.sleep(1)
    print('Done Sleeping...')

thread_1 = threading.Thread(target=pause)
thread_2 = threading.Thread(target=pause)

thread_1.start()
thread_2.start()

thread_1.join()
thread_2.join()

finish_time = time.perf_counter()
print(f'Finished in {round(finish_time - start_time, 2)} second(s)')

Program akan menjalankan kedua utas secara bersamaan. Ini akan mengurangi jumlah waktu yang dibutuhkan untuk menyelesaikan kedua tugas.

output dari program yang menunjukkan waktu yang dibutuhkan untuk menjalankan program

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.

 import time
import concurrent.futures

start_time = time.perf_counter()

def pause():
    print('Sleeping 1 second...')
    time.sleep(1)
    return 'Done Sleeping...'

with concurrent.futures.ThreadPoolExecutor() as executor:
    results = [executor.submit(pause) for _ in range(2)]
    for f in concurrent.futures.as_completed(results):
        print(f.result())

finish_time = time.perf_counter()

print(f'Finished in {round(finish_time - start_time, 2)} second(s)')

Modul concurrent.features menangani memulai dan menggabungkan utas untuk Anda. Ini membuat kode Anda lebih bersih.

output dari program yang menunjukkan waktu yang dibutuhkan untuk menjalankan program

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. Mulailah dengan membuat lingkungan virtual baru. Jalankan perintah berikut di terminal untuk menginstal permintaan perpustakaan:

 pip install requests 

Pustaka permintaan akan memungkinkan Anda mengirim permintaan HTTP. Impor pustaka permintaan dan pustaka waktu.

 import requests
import time

Buat daftar URL gambar yang ingin Anda unduh. Biarkan setidaknya sepuluh sehingga Anda dapat melihat perbedaan yang signifikan saat Anda menerapkan threading.

 img_urls = [
    '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 yang 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.

 start_time = time.perf_counter()
for img_url in img_urls:
    img_bytes = requests.get(img_url).content
    img_name = img_url.split("https://www.makeuseof.com/")[3]
    img_name = f'{img_name}.jpg'
    with open(img_name, 'wb') as img_file:
        img_file.write(img_bytes)
        print(f'{img_name} was downloaded...')
finish_time = time.perf_counter()
print(f'Finished in {finish_time - start_time} seconds')

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.

output dari program yang menunjukkan waktu yang dibutuhkan untuk mengunduh gambar

Ubah program untuk menggunakan threading menggunakan modul concurrent.features. Alih-alih loop, gunakan fungsi. Ini adalah fungsi yang akan Anda berikan ke pelaksana contoh.

 import requests
import time
import concurrent.futures

img_urls = [
    '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',
]

start_time = time.perf_counter()

def download_image(img_url):
    img_bytes = requests.get(img_url).content
    img_name = img_url.split("https://www.makeuseof.com/")[3]
    img_name = f'{img_name}.jpg'
    with open(img_name, 'wb') as img_file:
        img_file.write(img_bytes)
        print(f'{img_name} was downloaded...')

with concurrent.futures.ThreadPoolExecutor() as executor:
    executor.map(download_image, img_urls)

finish_time = time.perf_counter()

print(f'Finished in {finish_time-start_time} seconds')

Setelah memperkenalkan threading. Waktu berkurang secara signifikan. Hanya butuh 4 detik untuk menyelesaikan eksekusi program.

output dari program yang menunjukkan waktu yang dibutuhkan untuk mengunduh gambar

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.

Comment
Share:

Leave a Reply

Your email address will not be published. Required fields are marked *

Ad