Menggunakan Modul Threading di Python

Ridwan Fajar 16 Februari 2017

Menggunakan Modul Threading di Python

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)