Menggunakan Modul Threading di Python
Ridwan Fajar 16 Februari 2017
Threading adalah salah satu cara bagaimana kita dapat melakukan konkurensi dalam mengeksekusi sebuah operasi. Tidak seperti kode tanpa threading yang harus menunggu proses eksekusi kode sebelumnya beres, threading memisahkan sebagian kode dan mengeksekusinya di proses yang dia ciptakan sendiri.
Namun dalam penggunaan threading harus diperhatikan jumlah resource yang menjadi pembatasnya. Jangan sampai proses yang berat, dieksekusi dengan menggunakan thread yang terlalu banyak sehingga menghabiskan ruang CPU dan memori.
Sebagai contoh kita memiliki kode untuk mengambil isi konten web dan menghitung panjang karakternya:
import urllib2
def get_content_len(url):
response = urllib2.urlopen(url)
content = response.read()
print len(content)
urls = [
"http://www.codepolitan.com",
"http://www.codepolitan.com/articles",
"http://www.codepolitan.com/upcoming-event",
"http://www.codepolitan.com/course",
"http://www.codepolitan.com/statistics"
]
for url in urls:
get_content_len(url)
Berikut adalah lama eksekusi dari kode diatas dengan menggunakan time yang dimiliki Unix-like:
$ time python urlliber.py
54620
44998
40619
14745
28026
real 0m14.602s
user 0m0.229s
sys 0m0.112s
Sekarang akan kita ubah sedikit dan menggunakan modul threading untuk mengubah cara eksekusi saat pengambilan konten web:
import urllib2
import threading
def get_content_len(url):
response = urllib2.urlopen(url)
content = response.read()
print len(content)
urls = [
"http://www.codepolitan.com",
"http://www.codepolitan.com/articles",
"http://www.codepolitan.com/upcoming-event",
"http://www.codepolitan.com/course",
"http://www.codepolitan.com/statistics"
]
for url in urls:
t = threading.Thread(target=get_content_len, args=(url,))
t.start()
print "Mengambil panjang halaman web sudah selesai..."
Berikut adalah output dan lama eksekusi dari kode yang sudah ditambahkan dengan threading:
$ time python threader.py
Mengambil panjang halaman web sudah selesai...
14745
40619
44877
54620
28026
real 0m7.169s
user 0m0.229s
sys 0m0.108s
Namun kita melihat info "Mengambil panjang .. selesai ..." malah tampil dahulu. Bila kita ingin menampilkannya setelah semua thread selesai dieksekusi. Kita harus gunakan join() pada setiap thread.
Untuk itu mari kita ubah kodenya sedikit dengan menambahkan join() dan menampung setiap thread di dalam list:
import urllib2
import threading
def get_content_len(url):
response = urllib2.urlopen(url)
content = response.read()
print len(content)
urls = [
"http://www.codepolitan.com",
"http://www.codepolitan.com/articles",
"http://www.codepolitan.com/upcoming-event",
"http://www.codepolitan.com/course",
"http://www.codepolitan.com/statistics"
]
threads = []
for url in urls:
t = threading.Thread(target=get_content_len, args=(url,))
threads.append(t)
for t in threads:
t.start()
for t in threads:
t.join()
print "Mengambil panjang halaman web sudah selesai..."
maka hasil dan lama eksekusinya akan seperti berikut:
$ time python threader.py
14745
40619
44877
54620
28026
Mengambil panjang halaman web sudah selesai...
real 0m5.804s
user 0m0.206s
sys 0m0.049s
(rfs/python)