PDA

View Full Version : Paralel coding dengan Golang Part. 1


anvie
06-05-2010, 05:24 AM
Paralel coding? What de kamsud? Lupakanlah… itu hanya judul buat menarik perhatian pembaca :P. Ok gak pake basa-basi Mungkin kamu sudah tidak asing lagi dengan istilah multi threading, itu loh aplikasi yang dibagi proses rutinnya secara paralel —penjelasan paling sederhana— kalo lum ngerti ato pengen dapet penjelasan yang lebih rumit coba deh jalan-jalan bentar ke wikipedia (http://en.wikipedia.org/wiki/Multithreading).

http://t2.gstatic.com/images?q=tbn:M-bCVGarecrv0M::www.hungry-hackers.com/wp-content/uploads/2010/01/Google_Go.jpg&t=1&h=168&w=301&usg=__RL9A3J2pN1-djiv8Zc1Zdz3nHhM=

Oia sebelumnya aku gak akan pake istilah-istilah serem, yah lebih tepatnya meminimalisir penggunaan istilah-istilah yang resmi di sini buat mempermudah pemahaman terutama bagi para newbie kayag aku, karena istilah2 resmi tersebut akan mereduksi pemahaman terutama dalam penjabaran sebuah paradigma baru... ups...

Belum lama ini Google yang digawangi oleh Ken Thompson cs mendesain sebuah bahasa baru yang disebut dengan GOLANG (google petualang, eh google language). Menurutku bahasa ini unik kenapa? bukan karena dibuat oleh Google ataupun karena lambangnya hewan pengerat, tapi karena siapapun orang dengan latar seorang programmer yang baru aja liat sintaknya pasti serasa akrab, dejavu, karena bahasa ini seperti:


Javascript dengan adanya keyword `var` untuk inisialisasi variable kosong.
Delphi (Pascal family) dengan penampakan operator := (titk dua-sama dengan).
Python dengan adanya keyword `import`, `map` dan multiple return value.
C/C++ karena komentarnya pake dobel slash `//` atau slash bintang `/**/`, dan adanya fungsi entry bernama `main`.


Dan keunikan lain yang lebih aneh bisa kamu temui di website resminya golang. Tentu saja tidak semua fiturnya akan dibahas di sini, karena saya hanya akan membahas tentang salah satu fitur aja yang keren punya, yaitu `goroutine`, apa itu goroutine? kembali lagi ke multi threading, yah goroutine mirip dengan konsep threading, loh lalu apa kelebihannya dong? Beda halnya dengan thread yang menggunakan memory space sendiri atau yang lebih gaul biasa disebut dengan thread context, goroutine / co-routine dapat menjalankan intruksi secara paralel tanpa kehilangan handle context dengan intruksi dimana dia dijalankan, loh kok bisa? Ya bisalah… lebih detail tentang context ini bisa dipelajari di wikipedia tentang context switch (http://en.wikipedia.org/wiki/Context_switch), dan tentang coroutine wikipedia coroutine (http://en.wikipedia.org/wiki/Concurrent_computing).

Nah ngomongin tentang aplikasi yang sifatnya concurrent kayag gini, terutama pada aplikasi multithreading, pasti kamu bakal teringat dengan istilah-istilah nyebelin yang berhubungan dengan shared memory communication (SMC) dan message passing (MP), you know lah SMC bisa diakalin dengan mutex, semaphore, dan event, nah sekarang bagaimana dengan MP? Kalo kamu pernah pake Python Stackless, maka seharusnya kamu tau tentang channel, kalau kamu adalah programmer C++ dan suka Qt, seharusnya kamu tau tentang signal slots, yup, Golang munggunakan methode yang tidak jauh-jauh dengan itu.

Gak pake lama lah, sekarang prakteknya aja deh:

Biar mudah dipahami, saya buatkan contoh yang sangat sederhana menggunakan gambaran cerita, ceritanya gini, ada dua orang, dexlip dan xerion, salah satunya ingin dapat mengirimkan barang menggunakan jasa pak pos.

Contoh #1 kirimkiriman1.go


package main


import (
"fmt"
"os"
"time"
)


func dexlip(pos chan string){
pos <- "ikan"
}

func xerion(pos chan string){

kotak_surat := <- pos

fmt.Printf("Kiriman: %s\n", kotak_surat)

}


func main(){

// summon pak pos dulu
var pak_pos = make(chan string)

fmt.Println("Mulai...")

go dexlip(pak_pos)
go xerion(pak_pos)

fmt.Println("Selesai")

var buf [1]byte
os.Stdin.Read(&buf)
}


Setelah di-kompil dengan cara:


$ 6g kirimkiriman1.go
$ 6l -o test1 kirimkiriman1.go

dan dijalankan hasilnya:

$ ./test1
Mulai...
Selesai
Kiriman: ikan

Bisa dilihat tulisan `Selesai` tercetak terlebih dahulu, padahal ditulis setelah pemanggilan 2 fungsi dexlip() dan xerion(), kenapa begitu? kuncinya ada di keyword `go`, fungsi yang dipanggil dengan keyword ini akan berjalan secara paralel kongkuren, sehingga tidak terjadi blocking, artinya rutin utama tetep jalan tanpa perlu nunggu fungsi yang dipanggil selesai, itulah kenapa tulisan `Selesai` ditulis terlebih dahulu dibanding kan `Kiriman: ikan`.

Nah, sekarang mari kita modifikasi dikit kodenya, kita buat si dexlip ngirimin barang yang lebih banyak.

Contoh #2 kirimkiriman2.go


package main


import (
"fmt"
"os"
"time"
)


func dexlip(pos chan string){
pos <- "ikan"
pos <- "emas"
pos <- "kayu"
pos <- "udahan"
}

func xerion(pos chan string){
for {
kotak_surat := <- pos
if kotak_surat == "udahan" {
break
}
fmt.Printf("Kiriman: %s\n", kotak_surat)
time.Sleep(1000000000) // dalam nanosecond 1 milyar ns = 1 detik
}
fmt.Println("Semua dah terkirim. Pencet apa aja untuk mengakhiri")
}


func main(){

var pak_pos = make(chan string)

fmt.Println("Mulai...")

go xerion(pak_pos)
go dexlip(pak_pos)

fmt.Println("Selesai")

var buf [1]byte
os.Stdin.Read(&buf)
}


Dan hasilnya:


$ ./test2
Mulai...
Selesai
Kiriman: ikan
Kiriman: emas
Kiriman: kayu
Semua dah terkirim. Pencet apa aja untuk mengakhiri

Pada contoh kedua ini, saya buat fungsi xerion (penerima) dipanggil terlebih dahulu sebelum dexlip (pengirim). Mudah kan? Mungkin Anda bertanya? Apa pentingnya methode seperti ini? dan kenapa ini disebut kelebihannya bahasa golang? Akan saya jawab setelah pesan-pesan berikut….

M2R
06-05-2010, 12:15 PM
[OOT]
Do Events di VB tuh bs disebut multi threading ngga?

ansav pke multi threading kan? klo g salah bwt scannya, yg disebut modular apa gt (klo g salah)

Mas, kan saia baca ini h**p://www.vb-helper.com/howto_net_run_threads.html

klo saia g salah ngartiin, di artikel itu blg klo "SyncLock" itu gunanya membuat object lain tidak bs mengunci / menggunakan form sebelum object lain (yg telah mengunci form sebelumnya) membuka lock nya, apa ini berarti prosedur tidak bs berjalan sebelum prosedur lain membuka locknya? atau prosedur tidak bs mengeluarkan output di form sebelum prosedur lain membuka locknya?



trus apa gunanya mengunci form klo emang mw multi-threading? bukannya inti dr multi-threading tuh menjalankan prosedur lain sblm prosedur lain selesai di eksekusi.

HyperLinx
06-05-2010, 06:52 PM
Do Events di VB tuh bs disebut multi threading ngga?

ansav pke multi threading kan? klo g salah bwt scannya, yg disebut modular apa gt (klo g salah)

Wah ini kurang tahu saya, rasanya vb6 defaultnya tidak multi-threading
modular, mungkin maksudnya pakai dll, jadi tiap dll punya thread sendiri, begitukah ??


klo saia g salah ngartiin, di artikel itu blg klo "SyncLock" itu gunanya membuat object lain tidak bs mengunci / menggunakan form sebelum object lain (yg telah mengunci form sebelumnya) membuka lock nya, apa ini berarti prosedur tidak bs berjalan sebelum prosedur lain membuka locknya? atau prosedur tidak bs mengeluarkan output di form sebelum prosedur lain membuka locknya?

Itulah gunanya sinkronisasi(mutex,semaphore), agar thread yg lain tidak bisa mengakses sebuah resource secara bersamaan. makanya ini jadi antrian.


trus apa gunanya mengunci form klo emang mw multi-threading? bukannya inti dr multi-threading tuh menjalankan prosedur lain sblm prosedur lain selesai di eksekusi.

multi-threading, jadi banyak prosedur dengan tugas berbeda jalan bersamaan. kalau menunggu dulu prosedur lain selesai (tergantung keperluan), single thread kan juga bisa. kecuali fungsi yang dibikin thread sendiri agar tidak menggangu kerja module utama.

sori jika salah atau bikin tambah membingungkan :o_o:

M2R
06-06-2010, 08:08 AM
Wah ini kurang tahu saya, rasanya vb6 defaultnya tidak multi-threading
modular, mungkin maksudnya pakai dll, jadi tiap dll punya thread sendiri, begitukah ??


Haha, saia sendiri memang tidak yakin klo Do Events itu termasuk multi threading. LOL nah. Bginilah susahnya belajar IT, satu kata artinya bs beda. bgitu denger kata "modul" lgsg ingat ma DLL :D saia sendiri g ngerti apa maksud dr "modular" nya mas anvie =))


Itulah gunanya sinkronisasi(mutex,semaphore), agar thread yg lain tidak bisa mengakses sebuah resource secara bersamaan. makanya ini jadi antrian.


Weleh, saia blm mendalami Mutex n Semaphore. slama ini saia cmn tw klo Mutex dipake bwt alternatif App.PrevInstance. Ngantri? knp harus ngantri?
Maksudnya nie ngantri gmn? klo harus ngantri, ngapain bikin thread? sprti yg saia blg sebelumnya, bknnya the power of thread itu "menjalankan prosedur secara bersamaan" ?


multi-threading, jadi banyak prosedur dengan tugas berbeda jalan bersamaan. kalau menunggu dulu prosedur lain selesai (tergantung keperluan), single thread kan juga bisa. kecuali fungsi yang dibikin thread sendiri agar tidak menggangu kerja module utama.

sori jika salah atau bikin tambah membingungkan :o_o:
I got it, meskipun saia blm tahu contoh aplikasi yg sprti mas sebutkan di atas "fungsi yang dibikin thread sendiri agar tidak menggangu kerja module utama" :D


Hmm, masih binun ama implementasi multi-threading. Bs ngga ya, satu thread yg sama di jalankan berulang kali?

misal :

For i = 1 to 10
Thread.Start()
Next

HyperLinx
06-06-2010, 10:41 PM
bikin thread sendiri aja, bisa tidak campur aduk masalahnya,
nanti om TS-nya ngambek loh, seharusnyakan disini bahas paralel golang :p

om anvie,
saya kurang ngerti line berikut

func dexlip(pos chan string){
pos <- "ikan"
}

func xerion(pos chan string){
kotak_surat := <- pos
fmt.Printf("Kiriman: %s\n", kotak_surat)
}

maksudnya deklarasi "pos chan string" itu apa yah ?
lalu line berikutnya mungkin berarti, masukkan kata "ikan" ke variabel pos
"kotak_surat := <- pos", kotak_surat masih string tidak ?
titik dua sama dengan sama dengan assign ??
Printf akhirnya keluarkan output.

bingung saia :blink:

anvie
06-12-2010, 04:41 AM
@M2R: itu hanya event loop aja, gak pake threading bro.
@Hyperlink:
pos chan string ini adalah mendeklarasikan variabel pos sebagai channel yang bertipe string.
lalu operator := pada
kotak_surat := <- pos
artinya channel pos memberikan isinya kepada kotak surat, karena variabel pos adalah channel yang bertipe string maka otomatis dengan adanya operator := membuat kotak_surat bertipe string.